首页 > 解决方案 > Nestjs - 自定义拦截器应该组织在一个模块中吗?

问题描述

我的 api-gateway 中有一个拦截器,它转换rpc-exceptionshttp-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 { }    

那么就“嵌套方式”而言,更好的方法是什么?在第二个示例中,我将如何将拦截器注入我的控制器?

标签: nestjs

解决方案


这两种方法都很好。绑定拦截器时要考虑的一件大事是,您希望拦截器全局绑定还是仅绑定到类或路由?通过使用APP_INTERCEPTOR自定义提供程序方法,您可以全局绑定拦截器,因此如果您这样做,请确保您处理了所有边缘情况。否则,您@UseInterceptors(GrpcErrorsInterceptor)仍然可以让 Nest 使用 DI(如有必要)并将拦截器仅绑定到类或路由。


推荐阅读