下面是关于nestjs中异常过滤器ExceptionFilter的具体使用的攻略。
一、异常过滤器(ExceptionFilter)
在 Nest.js 中,我们可以使用 ExceptionFilter 对应用程序进行全局和局部错误处理。ExceptionFilter 可以帮助我们捕获抛出的异常并将其转换为可读错误响应或其他适当的操作。
1. 全局异常过滤器
全局异常过滤器默认存在于 Nest 应用程序中,可以处理不受控的异常。如果想要自定义全局异常处理可以新建一个全局的过滤器,然后在应用程序的主文件中进行引入。
新建一个全局的异常过滤器如下:
import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';
import { Response, Request } from 'express';
@Catch()
export class AnyExceptionFilter implements ExceptionFilter {
catch(exception: any, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
const status = (exception?.status && typeof exception.status === 'number') ? exception.status : 500;
response.status(status).json({
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
message: exception.message || 'Internal Server Error',
});
}
}
上面的代码 使用 @Catch()
装饰器标记了这是一个捕捉所有错误的过滤器,并实现了 ExceptionFilter
接口,覆盖了 catch()
方法。在捕获任何异常时,该方法都会自动触发,并根据异常返回适当的 HTTP 响应。
同时,在我们的应用程序的主入口文件(比如 main.ts)中引入该过滤器:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { AnyExceptionFilter } from './filters/any-exception.filter';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new AnyExceptionFilter());
await app.listen(3000);
}
bootstrap();
以上代码通过使用 useGlobalFilters()
方法将新的 ExceptionFilter 实例添加到应用程序的全局过滤器列表中。这意味着每当我们在应用程序中抛出异常时,都会使用自定义的 AnyExceptionFilter
进行处理。
2. 局部异常过滤器
我们还可以使用局部过滤器来对指定路由的异常进行处理,使用 @UseFilters()
装饰器来指定为路由添加过滤器。
import { Controller, Get, UseFilters } from '@nestjs/common';
import { CustomException } from '../exceptions/custom.exception';
import { CustomExceptionFilter } from '../filters/custom-exception.filter';
@Controller('customers')
@UseFilters(CustomExceptionFilter)
export class CustomersController{
@Get()
getAll() {
throw new CustomException('Something bad happened');
}
}
上面的代码,我们创建了一个 CustomExceptionFilter
过滤器,在 CustomersController
控制器的装饰器 @UseFilters()
中通过传递过滤器实例来为该控制器添加了局部过滤器。当我们在应用程序中发生 CustomException
异常时,上述自定义局部过滤器将使用其 catch()
方法捕获该异常并将异常转换为适当的 http 响应。
二、示例说明
下面通过两个示例来进行进一步说明如何使用 ExceptionFilter。
示例一:自定义ExceptionFilter
假设我们的API中会抛出自定义的异常,我们可以通过自定义的过滤器来统一拦截这些异常,并格式化返回到客户端。
import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';
import { Response, Request } from 'express';
@Catch(Error)
export class CustomExceptionFilter implements ExceptionFilter {
catch(error: Error, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
let statusCode = 500;
if (error instanceof HttpException) {
// HttpException是Nest的一个内置的异常类
statusCode = error.getStatus();
}
response.status(statusCode).json({
statusCode,
path: request.url,
timestamp: new Date().toISOString(),
message: error.message || 'Internal Server Error',
});
}
}
上面的代码实现了我们的自定义过滤器CustomExceptionFilter
,假设我们在代码中抛出了一个自定义的异常CustomException
,通过实现 catch()
方法来根据异常生成响应信息。通过 switchToHttp()
方法将请求和响应对象转换为了 Response
和 Request
对象。
示例二:过滤特定异常
除了处理自定义异常,我们还可以根据实际情况在同一个过滤器中处理不同的异常。
import { ExceptionFilter, Catch, ArgumentsHost, NotFoundException } from '@nestjs/common';
import { Response, Request } from 'express';
@Catch()
export class CustomExceptionFilter implements ExceptionFilter {
catch(error: Error, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
console.error(error);
let statusCode = 500;
if (error instanceof NotFoundException) {
statusCode = 404;
}
else if (error instanceof HttpException) {
statusCode = error.getStatus();
}
response.status(statusCode).json({
statusCode,
path: request.url,
timestamp: new Date().toISOString(),
message: error.message || 'Internal Server Error',
});
}
}
上面的代码引入了 NotFoundException 并且使用 instanceOf 检查可以拦截是否是该异常类型。我们同样可以响应地处理其它的异常类型。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nestjs中异常过滤器Exceptionfilter的具体使用 - Python技术站