Расширенные шаблоны и методы в 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, }); } }