繁体   English   中英

nestjs 如何不对 controller 应用全局拦截器

[英]nestjs how to no apply interceptor global to a controller

我有一个全局拦截器,但我不需要在指定的 controller 中应用。

app.useGlobalInterceptors(new ResponseInterceptor());

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

有谁知道该怎么做?

如果拦截器是全局的,它将应用于所有内容。 解决它的唯一方法是将某种自定义元数据应用于告诉拦截器不要为该路由运行的路由。 您需要在拦截器中添加一个检查以查找该元数据。 像这样的东西可能是你正在寻找的东西:

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;
  };
}

这个装饰器将元数据应用于 controller 或方法,然后在拦截器中您可以应用如下检查:

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;
  }
}

在我的实际代码库中,我对这个检查有更多的逻辑,但这对你来说应该是一个开始。

你可以绑定拦截器

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

https://docs.nestjs.com/interceptors

希望会有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM