创建自定义异常过滤器

在 NestJS 应用中,异常过滤器用于捕获和处理异常,然后返回一个统一的错误响应。以下是创建自定义异常过滤器的步骤:

1. 创建异常过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import { ArgumentsHost, Catch, ExceptionFilter, HttpException } from "@nestjs/common";
import { Request, Response } from 'express';

@Catch(HttpException)
export class HttpFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const request = ctx.getRequest<Request>();
const response = ctx.getResponse<Response>();
const status = exception.getStatus();

response.status(status).json({
success: false,
timestamp: new Date().toLocaleString(),
message: exception.message || '服务器错误',
code: status,
path: request.url,
});
}
}

2. 导入并注册异常过滤器

在主应用程序文件中注册异常过滤器,确保它能够捕获整个应用中的异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ResponseInterceptor } from './common/response'; // 确保这里引入的是正确的响应拦截器
import { HttpFilter } from './common/filter';

async function bootstrap() {
const app = await NestFactory.create(AppModule);

// 注册响应拦截器
app.useGlobalInterceptors(new ResponseInterceptor());

// 注册错误过滤器
app.useGlobalFilters(new HttpFilter());

await app.listen(3000);
}
bootstrap();

3. 使用异常过滤器

在控制器中抛出异常,异常将被 HttpFilter 捕获并处理。

1
2
3
4
5
6
7
8
9
10
import { Get, Controller, HttpException, HttpStatus } from '@nestjs/common';

@Controller('user')
export class UserController {
@Get()
findAll() {
// 模拟一个异常
throw new HttpException('请求失败', HttpStatus.NOT_FOUND);
}
}

4. 页面结果

当异常被抛出并捕获后,客户端将收到以下格式的响应:

1
2
3
4
5
6
7
{
"success": false,
"timestamp": "2024/9/14 00:36:01",
"message": "请求失败",
"code": 404,
"path": "/user"
}

总结

通过创建自定义的异常过滤器,我们可以统一处理 NestJS 应用中的异常,并返回一个清晰且一致的错误响应。这不仅提高了应用的健壮性,也使得前端开发者能够更容易地处理错误情况。