NestJS — это JavaScript фреймворк, который можно использовать для создания масштабируемых и динамических приложений на стороне сервера очень быстро и легко. NestJS построен на TypesScript и поддерживает TypeScript из коробки, по ощущениям он очень похож на использование Angular, но с обратной стороны видно, что на проект сильно повлиял Angular. NestJS навязывает определенную структуру приложения, и это одно из преимуществ использования NestJS.
NestJS сочетает в себе лучшее из ООП и функционального программирования, он также использует преимущества использования TypeScript. Он построен на основе некоторых популярных библиотек, которые мы используем для создания серверных приложений NodeJS, таких как Express и Cors. NestJS — это высокоуровневая абстракция, построенная на этих простых библиотеках, поэтому в разработку фреймворка было вложено много усилий, и некоторые из очевидных преимуществ, которые дает использование фреймворка, включают;
- Сокращение ненужного кода
- Быстрое время разработки
- Простота тестирования приложений
Как бы мы ни говорили, что JavaScript действительно крут, есть некоторые подводные камни, связанные с использованием JavaScript, особенно для приложений на стороне сервера. Часто возникает проблема структуры файлов и модулей, отсутствие типов, слишком много дублирующегося кода, и довольно сложно протестировать ваше приложение. Все эти проблемы знакомы некоторым разработчикам, и цель использования NestJS — предоставить элегантное решение всех этих проблем.
Nest JS был создан для придания проектам определенного уровня структурированности, чаще всего начинающие разработчики сталкиваются с проблемой выбора правильной структуры проекта, работы с зависимостями приложения и другими сторонними плагинами. NestJS — это подходящий инструмент для начинающего разработчика или любого, кто испытывает трудности с принятием определенной структуры приложения. Он также является хорошим решением вышеупомянутых проблем. NestJS также невероятно облегчает тестирование наших приложений.
Установка
Для установки NestJS необходимо убедиться, что на вашем компьютере установлен NodeJS, после чего можно запускать;
npm i -g @nestjs/cli
Это установит очень способный NestJS CLI, который поставляется с некоторыми командами, позволяющими нам создавать новые проекты и множество других полезных функций, которые нам понадобятся при создании приложений с NestJS.
Мы можем создать новый проект NestJS, выполнив следующие команды
nest new project-name
Это создаст для нас проект с некоторым базовым кодом, теперь вы можете перейти к открытию проекта в вашем любимом текстовом редакторе. Вот две команды, которые мы только что выполнили;
npm i -g @nestjs/cli
nest new project_name
В качестве альтернативы вы можете клонировать стартовый шаблон git
git clone https://github.com/nestjs/typescript-starter.git project_name;
Перейдите в только что созданную папку и установите зависимости.
cd project_name;
npm install;
Структура папок
Проект NestJS часто имеет следующую структуру папок в зависимости от используемой версии. На момент написания этой статьи NestJS находится в версии 9.0.5
. Мы будем рассматривать только папку src
, это будет единственная папка, с которой мы будем работать большую часть времени. Именно там будет храниться исходный код нашего приложения.
src/----------|------app.controller.ts
|------app.service.ts
|------app.module.ts
|------main.ts
main.ts
Этот файл содержит код, необходимый для загрузки и запуска нашего приложения. Он импортирует NestFactory
и главный модуль для нашего приложения, создает для нас серверное приложение и слушает на указанном порту входящий запрос.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000, () => console.log(`App started on PORT 3000`));
}
bootstrap();
Вызов метода create()
из NestFactory
создает для нас http-приложение из главного модуля приложения. Приложение, возвращаемое этим методом, удовлетворяет интерфейсу NestExpressApplication
, и этот интерфейс открывает для нас некоторые полезные методы. Мы запускаем http-сервер, вызывая app.listen()
, как и в случае с экспресс-приложением. Если это еще не очевидно, то теперь вы видите преимущество работы с NestJS, включение CORS
в нашем приложении так же просто, как вызов app.enableCors()
в нашем приложении. Обычно это требует от нас сначала установить модуль cors
, а затем использовать его в качестве промежуточного ПО. Для создания нашего http приложения/сервера нам нужно передать основной модуль нашего приложения в качестве аргумента методу create
NestFactory
, мы посмотрим на app.module.ts
ниже.
app.module.ts
Модуль в NestJS — это просто структура данных для управления зависимостями нашего приложения. Модули используются в Nest для организации структуры приложения по диапазонам. Контроллеры и провайдеры определяются модулем, в котором они объявлены. Модули и их классы (контроллеры и провайдеры) образуют граф, определяющий работу Nest. Чтобы класс служил модулем NestJS, он должен быть украшен декоратором @Module()
. Давайте рассмотрим содержимое app.module.ts
.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller.ts';
import { AppService } from './app.service.ts';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService]
})
export class AppModule {}
Массив imports отвечает за обработку других модулей, от которых зависит данный модуль. По мере роста нашего приложения у нас будут появляться другие модули, поскольку NestJS предлагает, чтобы каждая функция в приложении имела свой собственный модуль, а не загрязняла глобальное пространство имен модуля. Массив imports обрабатывает эти другие модули. Массив controllers
обрабатывает контроллеры, которые мы создаем в нашем приложении, а массив providers обрабатывает services
, которые мы создаем в нашем приложении. Класс модуля также определяет границы контроллеров и провайдеров, делая их доступными только в том модуле, в котором они зарегистрированы. Мы собираемся сделать краткий обзор контроллеров
и сервисов
.
app.service.ts
Сервис в NestJS похож по концепции на сервис в Angular, сервис — это просто класс, который инкапсулирует вспомогательные методы в нашем приложении, мы определяем функции, которые помогают выполнять определенные действия, в нашем примере мы определяем только один метод в app.service.ts
, который возвращает hello world! Другое название сервиса — провайдер. Давайте рассмотрим наш файл app.service.ts
.
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
Чтобы класс мог служить провайдером, он должен быть украшен @Injectable
, который экспортируется @nestjs/common
, мы можем перейти к объявлению методов класса, которые мы используем в нашем коде.
app.controller.ts
Контроллер — это еще одно причудливое название обработчика маршрутов, контроллер определяет метод, который обычно прикрепляется к маршруту, и при каждом запросе к серверу, который соответствует определенному маршруту, контроллер вызывает функцию, прикрепленную к маршруту.
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
Мы уже выяснили, что NestJs использует инъекцию зависимостей, в приведенном выше контроллере мы инъецируем провайдера AppService
, чтобы мы могли использовать методы, объявленные в нем. Чтобы класс служил контроллером, он должен быть украшен декоратором @Controller
, как показано выше, декоратор может принимать строку в качестве аргумента, эта строка будет служить базовым маршрутом для данного контроллера. Http-глаголы могут быть применены в качестве декораторов к функциям, которые будут обрабатывать входящий запрос. В приведенном выше примере декоратор @Get
, соответствующий http-глаголу GET
, применяется к функции getHello
. Таким образом, всякий раз, когда на сервер поступает запрос GET
, функция getHello
вызывается как обработчик этого маршрута.
Декораторы, служащие глаголами http, также принимают строки в качестве аргумента, и они служат в качестве вторичного пути для сопоставления после пути, определенного в @Controller
. В приведенном выше примере базовым маршрутом является /
, поскольку в декоратор @Contorller
не передается аргумент, а маршрут для контроллера @Get
также /
, поскольку в декоратор @Get
, прикрепленный к функции getHello
, также не передается аргумент, поэтому запрос к серверу http: //localhost:3000/
вернет hello world
.
Запуск приложения
Чтобы запустить сервер, просто запустите его;
npm start
NestJS CLI, к которому у вас есть доступ, если он установлен с помощью npm i @nestjs/cli
, загрузит и запустит приложение для нас в режиме производства. Чтобы запустить сервер в режиме разработки, который обеспечивает горячую перезагрузку, мы можем запустить npm i start:dev
и все изменения, которые мы сделаем, пока сервер работает локально, вступят в силу.
В последующих статьях этой серии мы будем изучать провайдеры NestJS, контроллеры, модули и многие другие возможности NestJS. На этом сегодня все, надеюсь, вам понравилось и вы нашли это полезным, пожалуйста, оставьте свой комментарий ниже о ваших мыслях или опыте использования NestJS, не стесняйтесь добавить все, что я упустил в этом вступлении в комментариях.