NestJS 拦截器 异常过滤器

180 阅读1分钟

响应拦截器

拦截器具有一组有用的功能,这些功能的灵感来自 面向方面编程 (AOP) 技术。 它们可以:

  • 在方法执行之前/之后绑定额外的逻辑
  • 转换函数返回的结果
  • 转换函数抛出的异常
  • 扩展基本功能行为
  • 根据特定条件完全覆盖函数(例如,出于缓存目的)

尤其是 返回给前端的格式 是要统一的

不然前端该骂娘了

为了使路由专注业务 统一封装响应

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

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

@Injectable()
export class TransformInterceptor<T> implements NestInterceptor<T, Data<T>> {
  intercept(context: ExecutionContext, next: CallHandler): Observable<Data<T>> {
    return next.handle().pipe(map(data => ({ 
        data,
        code:200,
        message:'success'
     })));
  }
}
app.useGlobalInterceptors(new TransformInterceptor())

image.png

异常过滤器

Nest 带有一个内置的 异常层,它负责处理应用中所有未处理的异常。 当你的应用代码未处理异常时,该层会捕获该异常,然后自动发送适当的用户友好响应

import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, 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 request = ctx.getRequest<Request>();
    const status = exception.getStatus();

    response
      .status(status)
      .json({
        code: status,
        timestamp: new Date().toISOString(),
        path: request.url,
      });
  }
}
app.useGlobalFilters(new HttpExceptionFilter())

image.png