Разработка приложений Node.js с помощью NestJS

Node.js внешний интерфейс TypeScript
Разработка приложений Node.js с помощью NestJS

NestJSСамый ранний проект был создан в январе 2017 г., а первая официальная версия была выпущена в 2017 г. 5. Это серверная структура, основанная на Express и разработанная с помощью TypeScript. В начале проектирования он в основном использовался для решения архитектурных проблем при разработке приложений Node.js, вдохновленных Angular. В этой статье я расскажу о некоторых основных моментах NestJS.

контейнер компонентов

NestJS использует способ контейнера компонентов, каждый компонент отделен от других компонентов, когда один компонент зависит от другого компонента, вам необходимо указать зависимость узла для использования:

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
import { OtherModule } from '../OtherModule';

@Module({
  imports: [OtherModule],
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}

Внедрение зависимостей (DI)

Подобно Angular, он разработан с использованием шаблона проектирования внедрения зависимостей.

При использовании объекта контейнер внедрения зависимостей уже создал его за вас, и нет необходимости вручную создавать его экземпляр для достижения цели разделения:

// 创建一个服务
@Inject()
export class TestService {
  public find() {
    return 'hello world';
  }
}

// 创建一个 controller
@Controller()
export class TestController {
  controller(
    private readonly testService: TestService
  ) {}
  
  @Get()
  public findInfo() {
    return this.testService.find()
  }
}

чтобы позволитьTestControllerиспользоватьTestServiceСервис, просто нужно написать как провайдер при создании модуля:

@Module({
  controllers: [TestController],
  providers: [TestService],
})
export class TestModule {}

Конечно, вы можете принести либо@Inject()Класс внедряется в модуль для использования контроллером или службой этого модуля.

Реализация, стоящая за ним, основана на метаданных Decorator + Reflect, подробности можно посмотретьГлубокое понимание TypeScript — Reflect Metadata.

Детализированное ПО промежуточного слоя

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

Например, используйте фильтры, чтобы перехватывать ошибки, выдаваемые обрабатывающим приложением:

@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
  catch(exception: any, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const request = ctx.getRequest();
    const status = exception.getStatus();

    // 一些其他做的事情,如使用日志

    response
      .status(status)
      .json({
        statusCode: status,
        timestamp: new Date().toISOString(),
        path: request.url,
      });
  }
}

Используйте перехватчик для перехвата данных ответа, чтобы возвращаемый формат данных был{ data: T }форма:

import { Injectable, NestInterceptor, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

export interface Response<T> {
  data: T;
}

@Injectable()
export class TransformInterceptor<T>
  implements NestInterceptor<T, Response<T>> {
  intercept(
    context: ExecutionContext,
    call$: Observable<T>,
  ): Observable<Response<T>> {
    return call$.pipe(map(data => ({ data })));
  }
}

С Guards, если у вас нет роли «admin», возвращается ошибка 401:

import { ReflectMetadata } from '@nestjs/common';
export const Roles = (...roles: string[]) => ReflectMetadata('roles', roles);

@Post()
@Roles('admin')
async create(@Body() createCatDto: CreateCatDto) {
  this.catsService.create(createCatDto);
}

проверка данных

выгода отclass-validatorа такжеclass-transformerВалидация входящих параметров становится очень простой:

// 创建 Dto
export class ContentDto {
  @IsString()
  text: string
}

@Controller()
export class TestController {
  controller(
    private readonly testService: TestService
  ) {}
  
  @Get()
  public findInfo(
    @Param() param: ContentDto     // 使用
  ) {
    return this.testService.find()
  }
}

Когда входящий текст параметра не является строкой, возникает ошибка 400.

GraphQL

Разработанный facebook, GraphQL считается революционным инструментом API, поскольку он позволяет клиенту указывать нужные данные в запросе, вместо того, чтобы быть предварительно заданным на бэкэнде, как традиционный REST.

NestJS оборачивает сервер Apollo, чтобы упростить его использование в NestJS.

При использовании сервера Apollo с Express:

const express = require('express');
const { ApolloServer, gql } = require('apollo-server-express');

// Construct a schema, using GraphQL schema language
const typeDefs = gql`
  type Query {
    hello: String
  }
`;

// Provide resolver functions for your schema fields
const resolvers = {
  Query: {
    hello: () => 'Hello world!',
  },
};

const server = new ApolloServer({ typeDefs, resolvers });

const app = express();
server.applyMiddleware({ app });

const port = 4000;

app.listen({ port }, () =>
  console.log(`Server ready at http://localhost:${port}${server.graphqlPath}`),
);

Используйте его в Nestjs:

// test.graphql
type Query {
  hello: string;
}


// test.resolver.ts
@Resolver()
export class {
  @Query()
  public hello() {
    return 'Hello wolrd';
  }
}

Способ использования Decorator, он также выглядит болееTypeScript.

разное

В дополнение к некоторым из вышеперечисленных списков, NestJS реализует разработку микросервисов, сотрудничествоTypeORM,так же какPrismaТакие функции не расширены здесь.

Ссылаться на