На прошлой неделе мне пришла в голову мысль исследовать фреймворки, доступные в экосистеме NodeJS, для разработки бэкэнд-API. Я использовал ExpressJS в течение долгого времени, и я подумал, что пора посмотреть, на что похожи альтернативные фреймворки.
Я начал перечислять все функции, которые я хотел, в хорошей среде NodeJS:
- Легко развиваться
- модульность
- Интеграция с другими приложениями
- растяжимость
- ремонтопригодных
- Производительность
- Легко тестировать и развертывать
- Поддержка DevOps готова
- Поддержка микросервисов
- REST и GraphQL
Я взял свои специальные очки анализатора, заправил машину времени и начал свое путешествие в будущее в поисках новой основы. Я прошел через такие фреймворки, как Коа, Хапи, Молекуляр, Сенека и т. Д. Но ни один из них не удовлетворил все мои потребности. Затем я увидел NestJS .
Nest (NestJS) — это футуристическая структура для создания эффективных, масштабируемых серверных приложений Node.js. Он использует прогрессивный JavaScript, построен с использованием и полностью поддерживает TypeScript (но все же позволяет разработчикам кодировать на чистом JavaScript) и объединяет элементы OOP (объектно-ориентированное программирование), FP (функциональное программирование) и FRP (функциональное реактивное программирование). Он построен поверх TypeScript, также доступна версия JavaScript. Фреймворк построен на основе понятий Angular и положил их поверх ExpressJS или Fastify .
Да, вы правильно поняли. Я могу изменить базовую базовую среду на Express или Fastify без изменения какого-либо кода. (Fastify имеет проверенный послужной список, когда дело доходит до производительности.)
Давайте посмотрим, как вы можете настроить NestJS.
Вам также может понравиться:
Nest.js Приносит TypeScript к Node.js и Express, часть 1 .
Монтаж
Установка довольно проста. Вы можете использовать npm / yarn для установки фреймворка.
Оболочка
xxxxxxxxxx
1
npm i -g @nestjs/cli
2
nest new my-first-project
Cli спросит, какой тип системы упаковки вы хотите (npm / yarn). После завершения установки вы можете запустить приложение, используя скрипт запуска.
Оболочка
xxxxxxxxxx
1
cd my-first-project
2
npm run start
Откройте любой браузер и перейдите по адресу http: // localhost: 3000 . Теперь вы увидите «Hello World!» сообщение.
Ура!
Вы также можете использовать npm run start
для запуска в приложении в режиме разработки. Это будет следить за любыми изменениями в вашем коде и соответственно перезапускать приложение.
Первый API
В большинстве базовых сред NodeJS при написании API мы создаем метод обратного вызова для определенного URL-адреса. Это не так в NestJS.
Если у вас есть фон Angular / Spring Boot, вы найдете очень знакомые ниже функции.
В NestJS для создания API нам нужен контроллер, похожий на компонент в Angular (или RestController в Springboot).
Допустим, мне нужно создать API времени, которое возвращает текущее время сервера. Запустите следующую команду CLI в каталоге вашего проекта, чтобы создать новый контроллер:
Оболочка
xxxxxxxxxx
1
nest g controller time
Это создаст два файла. В time.controller.spec.ts это тестовый файл и time.controller.ts наш главный файл
Оболочка
xxxxxxxxxx
1
CREATE /src/time/time.controller.spec.ts (479 bytes)
2
CREATE /src/time/time.controller.ts (97 bytes)
3
UPDATE /src/app.module.ts (322 bytes)
Вы можете видеть , что он обновляет app.module.ts
файл , чтобы добавить ссылку на новый контроллер, time.controller
. Это похоже на загрузку компонента в Angular.
Вот как выглядит структура папок:
Ура
Откройте файл time.controller.ts и замените код следующим блоком:
Машинопись
xxxxxxxxxx
1
import { Controller, Get } from '@nestjs/common';
2
@Controller('time')
4
export class TimeController {
5
@Get()
6
getTime(): any {
7
return {
8
time : new Date(),
9
};
10
}
11
}
12
Перезапустите приложение (если вы запустили его в режиме разработки, оно перезапустится автоматически) и получите доступ к http: // localhost: 3000 / time, используя Postman / browser / curl.
Теперь вы увидите следующий ответ JSON.
xxxxxxxxxx
1
{
2
"time": "2019-12-31T05:06:31.805Z"
3
}
Если вы указали аргумент в @Get
декораторе, то URL API изменится соответственно. Таким образом, эффективный URL-адрес API должен быть «API» + @ URL-адрес контроллера + @ Get-URL.
Аналогично @Get
, NestJS также поддерживает другие REST глаголы, как @Post
, @Put
, @Update
, @Delete
и т.д. объект Безотносительно возвращается из метода отправляется обратно клиенту в качестве результата API. Вы можете получить более подробную информацию о реализации контроллера по адресу https://docs.nestjs.com/controllers .
Это одна из самых простых реализаций API в NodeJS, похожая на реализацию Spring Boot в Java.
Обработка исключений
В NodeJS мы используем промежуточное ПО try / catch или exception для обработки ошибок в приложении. Но в NestJS этот подход уникален. Вы можете создать класс фильтра, который может обрабатывать определенные исключения.
Машинопись
xxxxxxxxxx
1
import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
2
import { Request, Response } from 'express';
3
@Catch(HttpException)
5
export class HttpExceptionFilter implements ExceptionFilter {
6
catch(exception: HttpException, host: ArgumentsHost) {
7
const ctx = host.switchToHttp();
8
const response = ctx.getResponse<Response>();
9
const request = ctx.getRequest<Request>();
10
const status = exception.getStatus();
11
response
13
.status(status)
14
.json({
15
statusCode: status,
16
timestamp: new Date().toISOString(),
17
path: request.url,
18
});
19
}
20
}
Это означает, что если a HttpException
выбрасывается из какой-либо части приложения, этот фильтр срабатывает, логика выполняется, и ответ отправляется обратно клиенту.
Легко? А? Вы можете найти более подробную информацию на https://docs.nestjs.com/exception-filters .
гвардия
Безопасность очень важна. Обычно в приложении ExpressJS мы используем промежуточное ПО для проверки уровня авторизации API. В NestJS мы можем использовать охрану.
Машинопись
xxxxxxxxxx
1
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
2
import { Observable } from 'rxjs';
3
@Injectable()
5
export class RolesGuard implements CanActivate {
6
canActivate(
7
context: ExecutionContext,
8
): boolean | Promise<boolean> | Observable<boolean> {
9
return true;
10
}
11
}
12
и в контроллере:
xxxxxxxxxx
1
@Controller('cats')
2
@UseGuards(RolesGuard)
3
export class CatsController {}
Вы также можете создать глобальную охрану в app.module.ts
Машинопись
xxxxxxxxxx
1
const app = await NestFactory.create(AppModule);
2
app.useGlobalGuards(new RolesGuard());
Поддержка микросервисов
Одним из самых больших преимуществ этого фреймворка является его встроенная поддержка для микросервисов и транспортных уровней. Он поддерживает различные транспортные уровни, такие как TCP, gRPC, MQTT, RabbitMQ и т. Д.
Вы можете прочитать больше о микросервисах в NestJS @ https://docs.nestjs.com/microservices/basics .
GraphQL
NestJS имеет встроенную поддержку GraphQL. Для начала установите пакет поддержки GraphQL:
Оболочка
xxxxxxxxxx
1
npm i --save @nestjs/graphql apollo-server-express graphql-tools graphql
NestJS предлагает два метода для интеграции GraphQL:
- Сначала схема: где определение написано на языке определения схем GraphQL (SDL).
- Сначала код: где мы используем декораторы для генерации схемы GraphQL.
Вы можете узнать больше об интеграции GraphQL @ https://docs.nestjs.com/graphql/quick-start .
Экспресс и Ускорение
Еще одна впечатляющая особенность NestJS заключается в том, что он может работать поверх платформ Express или Fastify, и вам не нужно менять код своего API для этого. Если вы хотите получить доступ к любым встроенным функциям Express или Fastify, это довольно просто.
По умолчанию NestJS использует Express. Если вы хотите использовать Fastify, то вы можете установить пакет для Fastify следующим образом:
Оболочка
xxxxxxxxxx
1
npm i --save @nestjs/platform-fastify
Результаты тестов показывают, что Fastify имеет превосходную производительность по сравнению с Express.
Больше вкусностей
NestJS также имеет встроенную поддержку Swagger , Jest , Supertest , TypeORM , Sequelize , Terminus , Compodoc , пользовательских декораторов и многих других ...
Завершение
IMHO NestJS - это фреймворк, который можно использовать в небольших бэкэнд-приложениях для больших приложений уровня предприятия. Это поможет вам в создании эффективного, масштабируемого приложения. Поддерживаемость этой инфраструктуры огромна по сравнению с другими платформами NodeJS.
Я видел проекты, использующие ExpressJS, где возможность сопровождения кода стала серьезной проблемой после нескольких месяцев разработки. Возможность переключения Express и Fastify является одной из замечательных функций NestJS.
Зайдите на https://nestjs.com, чтобы начать разработку своего приложения.
Удачного кодирования!