Skip to content

全局异常过滤器

全局异常过滤器是 NestJS 中用于处理应用程序中未处理的异常的机制。它允许开发者定义一个统一的错误处理逻辑,从而在应用程序中捕获和处理所有未被捕获的异常。

创建全局异常过滤器

要创建一个全局异常过滤器,你需要实现 ExceptionFilter 接口,并使用 @Catch() 装饰器来指定要捕获的异常类型。以下是一个简单的全局异常过滤器的示例:

typescript
import { ArgumentsHost, BadRequestException, Catch, ExceptionFilter, HttpException, HttpStatus, Logger, ValidationError } from '@nestjs/common';
import { ERROR_MSG, RESPONSE_CODE } from 'src/common/enums';

@Catch()
export class GlobalFilter implements ExceptionFilter {
  private Logger = new Logger();
  catch(exception: any, host: ArgumentsHost) {
    // 打印异常信息
    this.Logger.error(exception);
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<import('express').Response>();
    const status = exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR;
    if (exception instanceof BadRequestException) {
      const exceptionResponse: any = exception.getResponse();
      const validationErrors: ValidationError[] = exceptionResponse.message;
      const msgArr: string[] = [];

      // 递归获取错误信息
      const recursion = (errors: ValidationError[]) => {
        errors.forEach(error => {
          if (error.children && error.children.length) {
            recursion(error.children);
          } else {
            const errMsg = error.constraints ? Object.values(error.constraints).join('') : '';
            msgArr.push(errMsg);
          }
        });
      };
      recursion(validationErrors);

      response.status(status).json({
        code: status,
        msg: msgArr.join(', '),
      });
    } else {
      if (status === Number(RESPONSE_CODE.UNAUTHORIZED)) {
        response.status(status).json({
          code: RESPONSE_CODE.UNAUTHORIZED,
          msg: ERROR_MSG.TOKEN_EXPIRED,
        });
      } else if (status === Number(RESPONSE_CODE.NOT_FOUND)) {
        response.status(status).json({
          code: RESPONSE_CODE.NOT_FOUND,
          msg: ERROR_MSG.NOT_FOUND,
        });
      } else {
        response.status(status).json({
          code: RESPONSE_CODE.INTERNAL_SERVER_ERROR,
          msg: ERROR_MSG.SERVER_ERROR,
        });
      }
    }
  }
}

在这个示例中,我们创建了一个名为 GlobalFilter 的全局异常过滤器。它捕获所有未处理的异常,并根据异常类型返回相应的错误响应。 该过滤器会打印异常信息,并根据异常类型返回不同的错误响应。对于 BadRequestException,它会提取验证错误信息并返回;对于其他异常,则返回通用的错误消息。

使用全局异常过滤器

要使用全局异常过滤器,你需要在应用程序的主模块中进行配置。可以通过 app.useGlobalFilters() 方法来注册全局过滤器。以下是如何在 main.ts 文件中注册全局异常过滤器的示例:

typescript
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { GlobalFilter } from './common/filters/global.filter';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new GlobalFilter());
  await app.listen(3000);
}
bootstrap();

在这个示例中,我们在应用程序启动时注册了 GlobalFilter 作为全局异常过滤器。这样,所有未处理的异常都会被该过滤器捕获并处理。