В последние годы, в основном благодаря Node.js, JavaScript начал использоваться для создания серверных приложений. Что касается внешнего интерфейса, мы наблюдаем появление и консолидацию нескольких хороших фреймворков, таких как Angular, React и Vue.js.

Также появились серверные библиотеки и фреймворки для работы с Node.js, и одной из самых популярных по-прежнему остается Express. Не поймите меня неправильно, я люблю Express. Я работаю с ним как минимум пять лет. Express очень гибкий и простой в использовании, что экономит часы времени на кодирование при создании вашего нового API.

Но архитектура Express - серьезная проблема. Существует так много альтернатив, которые вы можете использовать в Express для кодирования разными способами, которые по-прежнему позволяют достичь аналогичных результатов. Это начинает превращаться в трудность в обучении новых сотрудников команды и приучении их к запуску проектов. А первым ученикам еще труднее понять, почему одни люди проектируют код одним способом, а другие придерживаются совершенно другой архитектуры.

Как мы могли бы иметь более стандартную масштабируемую архитектуру, которая могла бы без проблем работать также в корпоративных компаниях? Попытка решить эту проблему - вот где появляется NestJS и угадайте, что? По умолчанию он использует Express, скрытый под капотом.

Если вы привыкли работать с Express, попробовать NestJS будет проще простого.

NestJS - это платформа с открытым исходным кодом, предназначенная для создания масштабируемых серверных приложений с использованием возможностей TypeScript. Он также использует концепции объектно-ориентированного программирования, функционального программирования и функционального реактивного программирования.

Что касается разработки REST, в NestJS есть все встроенное для вас, например:

Он также предоставляет интерфейс командной строки, который позволяет вам создавать ваш скелет в соответствии с их архитектурой. Тем не менее, вы можете легко создать новый контроллер, используя одну строку кода, например:

nest g co name_of_your_controller

Вы тоже можете подумать - а что, если я буду работать с GraphQL? NestJS имеет встроенный модуль для всех ваших потребностей GraphQL, который вы можете запрограммировать как стратегию CodeFirst или классическую стратегию SchemaFirst.

Что касается тестирования, NestJS также предоставляет встроенный модуль, который очень легко настроить и использовать, который использует Jest и Supertest под капотом.

Пример первых шагов

Начать проект с NestJS очень просто. Очевидно, для этого требуются некоторые знания о Node.js, TypeScript и REST / GraphQL.

Чем больше у вас базовых знаний, тем проще будет работать независимо от технологии, с которой вы работаете.

Во-первых, вам необходимо убедиться, что у вас установлен Node.js. Затем в терминале просто введите:

npm i -g @nestjs/cli

Эта команда устанавливает nest cli, который позволяет вам начать разработку с помощью своего клиента. Чтобы запустить вложенный проект, вы можете запустить следующее

nest new my-first-nest-project

Эта команда запустит scaffold для вашего проекта и попросит вас выбрать между yarn или npm. В этом примере мы собираемся выбрать пряжу вместо npm.

We will scaffold your app in a few seconds..
CREATE my-first-nest-project/.eslintrc.js (666 bytes)
CREATE my-first-nest-project/.prettierrc (51 bytes)
CREATE my-first-nest-project/README.md (3339 bytes)
CREATE my-first-nest-project/nest-cli.json (64 bytes)
CREATE my-first-nest-project/package.json (1973 bytes)
CREATE my-first-nest-project/tsconfig.build.json (97 bytes)
CREATE my-first-nest-project/tsconfig.json (339 bytes)
CREATE my-first-nest-project/src/app.controller.spec.ts (617 bytes)
CREATE my-first-nest-project/src/app.controller.ts (274 bytes)
CREATE my-first-nest-project/src/app.module.ts (249 bytes)
CREATE my-first-nest-project/src/app.service.ts (142 bytes)
CREATE my-first-nest-project/src/main.ts (208 bytes)
CREATE my-first-nest-project/test/app.e2e-spec.ts (630 bytes)
CREATE my-first-nest-project/test/jest-e2e.json (183 bytes)
? Which package manager would you ❤️  to use?
npm
❯ yarn

После завершения у вас будет папка с именем my-first-nest-project. Откройте папку и введите yarn start

$ nest start
[Nest] 73358   - 01/12/2021, 11:57:45 AM   [NestFactory] Starting Nest application...
[Nest] 73358   - 01/12/2021, 11:57:45 AM   [InstanceLoader] AppModule dependencies initialized +46ms
[Nest] 73358   - 01/12/2021, 11:57:45 AM   [RoutesResolver] AppController {}: +5ms
[Nest] 73358   - 01/12/2021, 11:57:45 AM   [RouterExplorer] Mapped {, GET} route +2ms
[Nest] 73358   - 01/12/2021, 11:57:45 AM   [NestApplication] Nest application successfully started +1ms

Вот и все. У вас есть первый каркас, работающий с модулем и контроллером, настроенным для вас, со всей базовой архитектурой, готовой к работе. По умолчанию он запускает сервер на порту 3000. Вы можете открыть его в браузере на своем локальном хосте, например http: // localhost: 3000 /, или используя curl:

my-first-nest-project % curl localhost:3000
Hello World!%

Круто, правда? Давайте теперь проверим структуру кода. Есть несколько файлов конфигурации, которые мы не рассматриваем более подробно в этой статье, например nest-cli.json, tsconfig.json и другие, но очень важный, который стоит написать, - это src папка и ее файлы:

src/app.controller.spec.ts
src/app.controller.ts
src/app.module.ts
src/app.service.ts
main.ts

Базовая экосистема гнезда разделена на модуль, контроллер и сервис:

  • Модуль - это класс с аннотацией @Module, который предоставляет метаинформацию для организации структуры приложения.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
  • Контроллер отвечает за обработку HTTP-запросов и возврат ответов клиенту.
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();
  }
}
  • Сервис отвечает за обработку бизнес-логики, отвечает за хранение и извлечение данных, а также за внедрение зависимостей.
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

Файл main.ts - это главный вход в приложение. Здесь объявляется, какой модуль будет основным в приложении и какой порт будет запускать сервер.

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

Среда Nest уже настроена для запуска модульных тестов для всех файлов с расширением .spec.ts в своем имени. Это поможет вам при автоматизации модульных тестов.

import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';

describe('AppController', () => {
  let appController: AppController;

  beforeEach(async () => {
    const app: TestingModule = await Test.createTestingModule({
      controllers: [AppController],
      providers: [AppService],
    }).compile();

    appController = app.get<AppController>(AppController);
  });

  describe('root', () => {
    it('should return "Hello World!"', () => {
      expect(appController.getHello()).toBe('Hello World!');
    });
  });
});

Чтобы запустить модульное тестирование, просто запустите следующее: yarn run test

yarn run test
yarn run v1.22.4
$ jest
PASS  src/app.controller.spec.ts
AppController
root
✓ should return "Hello World!" (10 ms)
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.196 s, estimated 3 s
Ran all test suites.
✨  Done in 2.31s.

В папке test мы найдем файл с именем шаблона, содержащий e2e-specs.ts. Эти файлы отвечают за запуск тестов e2e в экосистеме гнезда. Они используют супертест под капотом, и если вы знакомы с ним, это довольно просто понять:

import { Test, TestingModule } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import * as request from 'supertest';
import { AppModule } from './../src/app.module';

describe('AppController (e2e)', () => {
  let app: INestApplication;

  beforeEach(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();

    app = moduleFixture.createNestApplication();
    await app.init();
  });

  it('/ (GET)', () => {
    return request(app.getHttpServer())
      .get('/')
      .expect(200)
      .expect('Hello World!');
  });
});

Для запуска тестов e2e используйте: yarn run test: e2e

yarn run test:e2e
yarn run v1.22.4
$ jest --config ./test/jest-e2e.json
PASS  test/app.e2e-spec.ts
AppController (e2e)
✓ / (GET) (349 ms)
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.574 s, estimated 3 s
Ran all test suites.
✨  Done in 2.63s.

Экосистема NestJS довольно большая, и я надеюсь, что эти вводные шаги помогли вам увидеть ее потенциал. Есть несколько крупных компаний, которые внедряют NestJS в свой стек разработки программного обеспечения, такие как Autodesk, Adidas, Decathlon и некоторые другие. Это делает его достойным кандидатом для следующей надежной структуры, которую вы изучите.

Документация NestJS довольно обширна, и есть несколько функций, из-за которых сложно говорить обо всех сразу. Что касается обновления моих предыдущих статей, в которых преподавались основы создания API с помощью Express, то в моих следующих статьях вы научитесь создавать тот же API, но с использованием NestJS. Знания для построения с использованием обоих фреймворков станут хорошей тренировкой для тех, кто хочет глубже погрузиться в Node.js и его фреймворки.

Тем временем я работаю над серией NestJS. Для начала настоятельно рекомендую свою предыдущую серию. Я считаю, что все это по-прежнему важно знать в 2021 году, поскольку никогда не знаешь, когда ты будешь работать с командой, которая также использует Express. Также помните, что NestJS использует Express под капотом, что делает ваше обучение беспроигрышным.



Если эта статья была для вас полезной, пожалуйста, хлопайте в ладоши. Это помогает мне понять, актуален ли контент, и побуждает продолжать писать. Также не стесняйтесь комментировать, если у вас есть какие-либо сомнения, сомнения или вопросы, или если вы чувствуете, что я совершил какие-либо ошибки. Все это помогает мне улучшить свои навыки письма.

Увидимся в следующей статье.



Больше контента на plainenglish.io