# 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
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
2
3
4
5
6
7
8
9
10
在上面的代码中,我们使用 app.useGlobalFilters(new HttpExceptionFilter())
将 HttpExceptionFilter
注册为全局的异常过滤器。这样,当应用程序中抛出 HttpException 类型的异常时,HttpExceptionFilter
将捕获这些异常并返回自定义的错误响应。