nestjs - Nestjs - 自定义拦截器应该组织在一个模块中吗?
问题描述
我的 api-gateway 中有一个拦截器,它转换rpc-exceptions
为http-exceptions
. 拦截器被放置在一个共享目录中,其中没有任何模块。
在我的控制器中,我像这样使用拦截器:
import { GrpcErrorsInterceptor } from 'shared/grpc-errors.interceptor';
@Controller('mycontroller')
@UseInterceptors(new GrpcErrorsInterceptor())
export class MyController { }
另一方面,我看到了将拦截器添加到模块中的提供程序数组的方法:
import { APP_INTERCEPTOR } from '@nestjs/core';
@Module({
providers: [
{
provide: APP_INTERCEPTOR,
useClass: MyInterceptor,
},
],
})
export class SharedModule { }
那么就“嵌套方式”而言,更好的方法是什么?在第二个示例中,我将如何将拦截器注入我的控制器?
解决方案
这两种方法都很好。绑定拦截器时要考虑的一件大事是,您希望拦截器全局绑定还是仅绑定到类或路由?通过使用APP_INTERCEPTOR
自定义提供程序方法,您可以全局绑定拦截器,因此如果您这样做,请确保您处理了所有边缘情况。否则,您@UseInterceptors(GrpcErrorsInterceptor)
仍然可以让 Nest 使用 DI(如有必要)并将拦截器仅绑定到类或路由。