簡體   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