Расширенные шаблоны и методы в NestJS

В этом разделе мы рассмотрим расширенные шаблоны и методы в NestJS, включая настраиваемые декораторы, перехватчики, средства защиты и фильтры исключений.

  • Пользовательские декораторы

Пользовательские декораторы позволяют создавать повторно используемую компонуемую логику в ваших приложениях NestJS. Их можно применять к классам, методам, свойствам или параметрам.

Пример:

import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const User = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return request.user;
  },
);

Этот пользовательский декоратор можно использовать для извлечения пользовательского объекта из запроса в методе контроллера:

import { Controller, Get } from '@nestjs/common';
import { User } from './user.decorator';

@Controller()
export class AppController {
  @Get('user')
  getUser(@User() user: any) {
    return user;
  }
}
  • Перехватчики

Перехватчики — это мощные компоненты, которые могут перехватывать и изменять HTTP-запросы и ответы. Их можно использовать для различных целей, таких как регистрация, кэширование или преобразование ответов.

Пример:

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

@Injectable()
export class TransformInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(map(data => ({ data })));
  }
}
  • Охранники

Охранники контролируют доступ к определенным маршрутам на основе определенных условий, таких как проверка подлинности или управление доступом на основе ролей.

Пример:

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    return request.isAuthenticated();
  }
}
  • Фильтры исключений

Фильтры исключений позволяют перехватывать и обрабатывать исключения централизованно. Вы можете создавать собственные фильтры исключений для обработки определенных типов исключений или использовать встроенный фильтр HttpExceptionFilter.

Пример:

import {
  ExceptionFilter,
  Catch,
  ArgumentsHost,
  HttpException,
} from '@nestjs/common';
import { Response } from 'express';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const status = exception.getStatus();
    const message = exception.message;
    response.status(status).json({
      statusCode: status,
      message,
    });
  }
}