如何在NestJs中使用并导入自定义Fallback异常过滤器
嘿,作为NestJS新手能写出异常过滤器已经很棒啦!下面我一步步教你怎么把这个HttpExceptionFilter集成到你的应用里,有几种不同的注册方式,你可以根据自己的需求来选:
如何在NestJS中集成你的HttpExceptionFilter
先确认下你写的过滤器代码(方便参考):
import { Catch, ExceptionFilter, ArgumentsHost, HttpException } from '@nestjs/common'; @Catch(HttpException) export class HttpExceptionFilter implements ExceptionFilter { public catch(exception: HttpException, host: ArgumentsHost): any { const ctx = host.switchToHttp(); const response = ctx.getResponse(); const statusCode = exception.getStatus(); /* Some code here */ return response.status(statusCode).json({ status: statusCode, datetime: new Date(), createdBy: "HttpExceptionFilter", errorMessage: exception.message, }) } }
(注:我补了获取响应对象和状态码的必要代码,如果你已经写了可以忽略~)
1. 全局注册(全应用所有路由生效)
如果你想让这个过滤器处理整个应用里的所有HttpException,最直接的方式是在main.ts里全局注册:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { HttpExceptionFilter } from './path/to/http-exception.filter'; // 替换成你的过滤器实际路径 async function bootstrap() { const app = await NestFactory.create(AppModule); // 全局注册过滤器 app.useGlobalFilters(new HttpExceptionFilter()); await app.listen(3000); } bootstrap();
如果你的过滤器需要依赖其他服务(比如注入了Logger),直接实例化的方式没法用依赖注入,这时候可以改用模块提供者的方式全局注册:
在AppModule里:
import { Module } from '@nestjs/common'; import { APP_FILTER } from '@nestjs/core'; import { HttpExceptionFilter } from './path/to/http-exception.filter'; @Module({ providers: [ { provide: APP_FILTER, useClass: HttpExceptionFilter, }, ], }) export class AppModule {}
这种方式既支持全局生效,又能正常使用依赖注入。
2. 模块级别注册(仅当前模块内控制器生效)
如果只想让过滤器作用于某个特定模块,可以在该模块的providers里配置:
import { Module } from '@nestjs/common'; import { APP_FILTER } from '@nestjs/core'; import { HttpExceptionFilter } from './path/to/http-exception.filter'; import { YourController } from './your.controller'; @Module({ controllers: [YourController], providers: [ { provide: APP_FILTER, useClass: HttpExceptionFilter, }, ], }) export class YourModule {}
3. 控制器/方法级别注册(仅指定范围生效)
如果只想让过滤器作用于单个控制器或者某个路由方法,可以用@UseFilters()装饰器:
控制器级别(该控制器下所有路由生效)
import { Controller, Get, UseFilters } from '@nestjs/common'; import { HttpExceptionFilter } from './path/to/http-exception.filter'; @Controller('users') @UseFilters(HttpExceptionFilter) export class UsersController { @Get() getUsers() { throw new HttpException('User not found', 404); } }
方法级别(仅当前路由方法生效)
import { Controller, Get, UseFilters } from '@nestjs/common'; import { HttpExceptionFilter } from './path/to/http-exception.filter'; @Controller('users') export class UsersController { @Get() @UseFilters(HttpExceptionFilter) getUsers() { throw new HttpException('User not found', 404); } }
内容的提问来源于stack exchange,提问作者BingBong
相关产品推荐
相关产品推荐

