推荐答案
在 NestJS 中,过滤器(Filters)是一种用于处理应用程序中未捕获异常的机制。它们允许你在异常发生时,对异常进行自定义处理,例如记录日志、返回特定的错误响应等。过滤器可以应用于控制器、方法或全局范围。
创建过滤器
要创建一个过滤器,你需要实现 ExceptionFilter 接口,并使用 @Catch() 装饰器来指定要捕获的异常类型。过滤器类必须实现 catch(exception: T, host: ArgumentsHost) 方法,其中 T 是你想要捕获的异常类型。
// www.javascriptcn.com code example
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({
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
});
}
}使用过滤器
过滤器可以通过以下几种方式使用:
- 控制器级别:使用
@UseFilters()装饰器将过滤器应用于整个控制器。
@Controller('cats')
@UseFilters(HttpExceptionFilter)
export class CatsController {
@Get()
findAll() {
throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
}
}- 方法级别:使用
@UseFilters()装饰器将过滤器应用于特定的方法。
@Controller('cats')
export class CatsController {
@Get()
@UseFilters(HttpExceptionFilter)
findAll() {
throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
}
}- 全局范围:使用
app.useGlobalFilters()方法将过滤器应用于整个应用程序。
const app = await NestFactory.create(AppModule); app.useGlobalFilters(new HttpExceptionFilter()); await app.listen(3000);
本题详细解读
过滤器的概念
NestJS 的过滤器是一种异常处理机制,允许开发者在应用程序中捕获和处理未捕获的异常。通过过滤器,你可以自定义异常的处理逻辑,例如记录日志、返回特定的错误响应等。过滤器可以应用于不同的范围,包括控制器、方法或全局范围。
过滤器的创建
要创建一个过滤器,你需要实现 ExceptionFilter 接口,并使用 @Catch() 装饰器来指定要捕获的异常类型。过滤器类必须实现 catch(exception: T, host: ArgumentsHost) 方法,其中 T 是你想要捕获的异常类型。在这个方法中,你可以访问异常对象和请求上下文,并根据需要处理异常。
过滤器的使用
过滤器可以通过 @UseFilters() 装饰器应用于控制器或方法级别,也可以通过 app.useGlobalFilters() 方法应用于全局范围。在控制器或方法级别应用过滤器时,只有该控制器或方法中的异常会被捕获和处理。在全局范围应用过滤器时,整个应用程序中的所有异常都会被捕获和处理。
示例代码
以下是一个完整的示例代码,展示了如何创建和使用一个 HTTP 异常过滤器:
// www.javascriptcn.com code example
import { ExceptionFilter, Catch, ArgumentsHost, HttpException, HttpStatus, Controller, Get, UseFilters } 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({
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
});
}
}
@Controller('cats')
@UseFilters(HttpExceptionFilter)
export class CatsController {
@Get()
findAll() {
throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
}
}在这个示例中,HttpExceptionFilter 过滤器捕获了 HttpException 异常,并返回了一个包含状态码、时间戳和请求路径的 JSON 响应。