NestJs — это мощная платформа для создания серверных приложений с помощью Node.js. Он предоставляет широкий спектр функций и инструментов, которые помогают разработчикам создавать масштабируемые, удобные в сопровождении и надежные приложения. В этой статье мы рассмотрим некоторые передовые методы в NestJ, включая ведение журнала и обработку ошибок.

Предпосылки

Давайте начнем углубляться в передовые методы NestJ для реализации ведения журнала и обработки ошибок с помощью встроенных декораторов и пакетов.

Создание REST API с помощью NestJ и MongoDB

Ведение журнала

Ведение журнала — важный метод отладки и мониторинга вашего приложения. Он включает в себя запись сообщений или событий, происходящих во время выполнения вашего приложения.

NestJs предоставляет встроенную поддержку ведения журналов с использованием различных поставщиков журналов, таких как Winston, Bunyan и других. Например, чтобы использовать Winston в качестве поставщика журналов, вы можете установить пакет @nestjs/platform-winston и добавить в свое приложение следующий код:

Перед внедрением кода установите следующие модули:

Обновите файл app.module.ts, указав следующие коды:

// app.module.ts
 
import { Logger, Module } from '@nestjs/common';
import { WinstonModule } from 'nest-winston';
import * as winston from 'winston';
 
@Module({
  imports: [
    WinstonModule.forRoot({
      transports: [
        new winston.transports.Console({
          format: winston.format.combine(
            winston.format.timestamp(),
            winston.format.colorize(),
            winston.format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`),
          ),
        }),
      ],
    }),
  ],
})

Этот код регистрирует Winston в качестве поставщика ведения журналов с консольным транспортом. Затем вы можете использовать экземпляр logger для регистрации сообщений:

// products.controller.ts
 
import { Controller, Get } from '@nestjs/common';
 
@Controller('products')
export class ProductsController {
  private readonly logger = new Logger(ProductsController.name);
 
  @Get()
  async findAll(): Promise<Product[]> {
    this.logger.log('Get all products api is called by StackBlogger!');
    // Retrieve products from the database
    const products = await this.productsService.findAll();
    this.logger.log(`${products.length} Records were returned to the response`);
    return products;
  }
}

В этом примере метод findAll() регистрирует сообщение, используя экземпляр logger.

Общение в реальном времени с помощью WebSockets и NestJ

Обработка ошибок

Обработка ошибок — важный метод обработки ошибок, возникающих во время выполнения вашего приложения. Он включает в себя перехват и обработку ошибок таким образом, чтобы предотвратить сбой приложения или получение неправильных результатов.

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

// http-exception.filter.ts
 
import { Catch, HttpException, ExceptionFilter, ArgumentsHost } from '@nestjs/common';
 
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const status = exception.getStatus();
    const message = exception.getResponse() as string;
 
    response.status(status).json({
      statusCode: status,
      message,
    });
  }
}

Этот код определяет HttpExceptionFilter, который перехватывает HttpException экземпляров и возвращает ответ JSON с кодом состояния и сообщением.

Затем вы можете использовать декоратор @UseFilters(), чтобы применить фильтр к контроллеру или методу:

// products.controller.ts
 
import { Controller, Get, NotFoundException, UseFilters } from '@nestjs/common';
 
@Controller('products')
@UseFilters(HttpExceptionFilter)
export class ProductsController {
  @Get(':id')
  async findOne(@Param('id') id: string): Promise<Product> {
    const product = await this.productsService.findOne(id);
    if (!product) {
      throw new NotFoundException(`Product with ID ${id} not found`);
    }
    return product;
  }
}

В этом примере метод findOne() выдает NotFoundException, если продукт с указанным идентификатором не найден. HttpExceptionFilter перехватывает это исключение и возвращает ответ JSON с кодом состояния 404 и сообщением.

Заключение

В этой статье мы рассмотрели некоторые передовые методы в NestJ, включая ведение журнала и обработку ошибок. Эти методы могут помочь вам создавать масштабируемые, удобные в сопровождении и надежные приложения. Используя встроенные поставщики и декораторы, вы можете легко реализовать эти методы в своем приложении.

Рекомендации NestJ по модульному тестированию

Первоначально опубликовано на https://stackblogger.com 5 мая 2023 г.