nestjs如何不将拦截器全局应用于控制器

时间:2020-05-13 21:04:14

标签: javascript nestjs

我有一个全局拦截器,但无需在指定的控制器中应用。

app.useGlobalInterceptors(new ResponseInterceptor());

  @Get()
  async method(@Query() query) {
      code here......
  }

有人知道怎么做吗?

2 个答案:

答案 0 :(得分:0)

如果拦截器是全局拦截器,则它将应用于所有对象。解决此问题的唯一方法是将某种自定义元数据应用于路由,以告知拦截器不要针对该路由运行。您需要在拦截器中添加检查以查找该元数据。您可能正在寻找这样的东西

export function OgmaSkip() {
  return (
    target: any,
    key?: string | symbol,
    descriptor?: TypedPropertyDescriptor<any>,
  ) => {
    if (descriptor) {
      Reflect.defineMetadata(OGMA_INTERCEPTOR_SKIP, true, descriptor.value);
      return descriptor;
    }
    Reflect.defineMetadata(OGMA_INTERCEPTOR_SKIP, true, target);
    return target;
  };
}

在此装饰器将元数据应用于控制器或方法的地方,然后在拦截器中,您可以应用如下检查:

public shouldSkip(context: ExecutionContext): boolean {
  const decoratorSkip =
    this.reflector.get(OGMA_INTERCEPTOR_SKIP, context.getClass()) ||
    this.reflector.get(OGMA_INTERCEPTOR_SKIP, context.getHandler());
  if (decoratorSkip) {
    return true;
  }
}

在我的实际代码库中,我对此检查有更多的逻辑,但这应该是您的起点。

答案 1 :(得分:0)

您可以绑定拦截器

@UseInterceptors(ResponseInterceptor)
@Get()
async method(@Query() query) {
  code here......
}

https://docs.nestjs.com/interceptors

希望会有所帮助