Nest核心组件 - 异常过滤器 Exception Filters

7/7/2023 NodejsNestjs

# 2.5 异常过滤器(Exception Filters)

异常过滤器在 NestJS 中用于全局地处理抛出的异常。当控制器或提供者抛出异常时,异常过滤器会捕获这些异常,并允许我们对它们进行处理,以返回友好的错误响应。

# 2.5.1 创建一个异常过滤器

让我们来创建一个简单的异常过滤器。在 src 目录下创建一个新的文件 http-exception.filter.ts,并编写以下代码:

import { ExceptionFilter, Catch, ArgumentsHost, HttpException, HttpStatus } 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 req = ctx.getRequest<Request>();
    const res = ctx.getResponse<Response>();
    const status = exception.getStatus() || HttpStatus.INTERNAL_SERVER_ERROR;

    res.status(status).json({
      statusCode: status,
      timestamp: new Date().toISOString(),
      path: req.url,
      message: exception.message || 'Internal server error',
    });
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

在上面的代码中,我们创建了一个实现了 ExceptionFilter 接口的异常过滤器类 HttpExceptionFilter。@Catch(HttpException) 装饰器指定该异常过滤器将处理 HttpException 类型的异常。

在 catch 方法中,我们可以访问异常对象 exception 和请求、响应对象,从而可以根据需要返回自定义的错误响应。

# 2.5.2 注册异常过滤器

要让异常过滤器生效,我们需要将它注册到应用程序中。打开 src/main.ts 文件,并添加以下代码:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './http-exception.filter';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new HttpExceptionFilter());
  await app.listen(3000);
}
bootstrap();
1
2
3
4
5
6
7
8
9
10

在上面的代码中,我们使用 app.useGlobalFilters(new HttpExceptionFilter())HttpExceptionFilter 注册为全局的异常过滤器。这样,当应用程序中抛出 HttpException 类型的异常时,HttpExceptionFilter 将捕获这些异常并返回自定义的错误响应。

编辑时间: 7/7/2023, 10:00:00 AM