如何在Nest.js自定义CacheInterceptor中注入ConfigService以禁用缓存
解决NestJS自定义CacheInterceptor注入ConfigService并禁用缓存的问题
步骤1:在自定义拦截器中注入ConfigService
修改你的HttpCacheInterceptor,在构造函数中注入ConfigService,并根据配置决定是否启用缓存:
import { Injectable, ExecutionContext } from '@nestjs/common'; import { CacheInterceptor } from '@nestjs/cache-manager'; import { ConfigService } from '@nestjs/config'; import { FastifyRequest } from 'fastify'; @Injectable() export class HttpCacheInterceptor extends CacheInterceptor { // 注入ConfigService,同时调用父类构造函数完成初始化 constructor(private readonly configService: ConfigService) { super(); } trackBy(context: ExecutionContext): string | undefined { // 从配置中读取缓存开关(示例配置项为cache.enabled) const isCacheEnabled = this.configService.get<boolean>('cache.enabled'); // 若缓存禁用,返回undefined跳过缓存处理 if (!isCacheEnabled) { return undefined; } const request = context.switchToHttp().getRequest<FastifyRequest>(); return `${request.hostname}:${request.url}`; } }
步骤2:确保ConfigModule全局注册
在AppModule中导入ConfigModule并设置为全局模块,这样ConfigService可以在拦截器中直接注入:
import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { APP_INTERCEPTOR } from '@nestjs/core'; import { CacheModule } from '@nestjs/cache-manager'; import { AppService } from './app.service'; import { HttpCacheInterceptor } from './http-cache.interceptor'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, // 全局注册,无需在其他模块重复导入 envFilePath: '.env', // 可选:指定你的环境变量文件路径 }), CacheModule.register(), // 确保缓存模块已注册 ], providers: [ AppService, { provide: APP_INTERCEPTOR, useClass: HttpCacheInterceptor, }, ], }) export class AppModule {}
可选:更彻底地跳过缓存逻辑
如果需要完全跳过缓存拦截的执行流程,可以重写intercept方法:
@Injectable() export class HttpCacheInterceptor extends CacheInterceptor { constructor(private readonly configService: ConfigService) { super(); } async intercept(context: ExecutionContext, next: CallHandler) { const isCacheEnabled = this.configService.get<boolean>('cache.enabled'); // 缓存禁用时直接执行后续请求流程,不走缓存逻辑 if (!isCacheEnabled) { return next.handle(); } // 缓存启用时调用父类逻辑处理缓存 return super.intercept(context, next); } trackBy(context: ExecutionContext): string | undefined { const request = context.switchToHttp().getRequest<FastifyRequest>(); return `${request.hostname}:${request.url}`; } }
环境变量配置示例
在你的.env文件中添加缓存开关:
CACHE_ENABLED=true
内容的提问来源于stack exchange,提问作者sonooby
相关产品推荐
相关产品推荐

