typescript - NestJs'te bazı rotalarda global önbelleği nasıl yoksayabilirsiniz


NestJS uygulamamda global önbelleği APP_INTERCEPTOR ile etkinleştiriyorum. Ancak şimdi, bazı rotalarda bunu yoksaymam gerekiyor. Bunu nasıl yapabilirim?

Cevap #1

Çözümü buldum. Her şeyden önce, CacheInterceptor'i genişleten bir CustomHttpCacheInterceptor yaptım:

@Injectable()
export default class CustomHttpCacheInterceptor extends CacheInterceptor {
  httpServer: any;
  trackBy(context: ExecutionContext): string | undefined {
    const request = context.switchToHttp().getRequest();
    const isGetRequest = request.method === 'GET';
    const requestURl = request.path;
    const excludePaths = ['/my/custom/route'];

    if (
      !isGetRequest ||
      (isGetRequest && excludePaths.some(url => requestURl.includes(url)))
    ) {
      return undefined;
    }
    return requestURl;
  }
}

ve sonra bunu app.module'de küresel bir önbellek kesici olarak ekliyorum

//...
  providers: [
    AppService,
    {
      provide: APP_INTERCEPTOR,
      useClass: CustomHttpCacheInterceptor,
    },
  ],
//...

Cevap #2

Sadra'nın önerdiğine farklı bir yaklaşım, trackBy() yöntemi yerine CacheInterceptor sınıfında isRequestCacheable() yöntemini geçersiz kılabilirsiniz. Bu biraz daha kolaydır.

@Injectable()
export class CustomCacheInterceptor extends CacheInterceptor {

  excludePaths = ["/my/custom/route"];

  isRequestCacheable(context: ExecutionContext): boolean {
    const req = context.switchToHttp().getRequest();
    return (
      this.allowedMethods.includes(req.method) &&
      !this.excludePaths.includes(req.url)
    );
  }
}

İlgili makaleler