NestJS模块工厂注入ioredis客户端时如何获取正确Token?
解决方案
要解决这个问题,你需要完成两个关键步骤:正确导出Redis客户端提供者,以及使用正确的Token注入Redis客户端。
1. 修改RedisModule,确保导出Redis客户端
首先,你的自定义RedisModule需要导出@nestjs-modules/ioredis提供的Redis客户端提供者,这样MyModule才能访问到它。你可以直接导出NestRedisModule,或者导出对应的Token:
import { RedisModule as NestRedisModule, getRedisToken } from '@nestjs-modules/ioredis'; import { ConfigModule, ConfigService } from '@nestjs/config'; @Module({ // 注意:先导入ConfigModule,确保ConfigService能被NestRedisModule的useFactory正确注入 imports: [ ConfigModule, NestRedisModule.forRootAsync({ useFactory: (config: ConfigService) => ({ type: 'single', url: config.get<string>('redis.url'), // 若使用命名客户端,可添加name字段,比如:name: 'session-redis' }), inject: [ConfigService], }), ], // 方式一:直接导出NestRedisModule,包含所有它注册的提供者 exports: [NestRedisModule], // 方式二:仅导出Redis客户端的Token(更精准) // exports: [getRedisToken()], }) export class RedisModule {}
2. 在MyModule中使用正确的Token注入Redis客户端
@nestjs-modules/ioredis提供了getRedisToken()方法来获取Redis客户端对应的依赖注入Token:
- 如果是默认客户端(未设置
name),直接调用getRedisToken()即可; - 如果是命名客户端(设置了
name: 'xxx'),调用getRedisToken('xxx')。
修改你的MyModule代码,替换MISSING_TOKEN_OF_REDIS_CLIENT为对应的Token:
import { getRedisToken } from '@nestjs-modules/ioredis'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { Redis } from 'ioredis'; import { MyService } from './my.service'; @Module({ imports: [ RedisModule, ConfigModule, // 需导入ConfigModule,因为useFactory中用到了ConfigService ], controllers: [], providers: [ { provide: MyService, useFactory: (config: ConfigService, redis: Redis) => { return new MyService(redis, config.get<number>('lit.redis.session.ttl')); }, // 注入ConfigService和Redis客户端 inject: [ConfigService, getRedisToken()], // 若使用命名客户端,这里改为getRedisToken('session-redis') }, ], exports: [MyService], }) export class LitModule {}
关键说明
getRedisToken()是@nestjs-modules/ioredis官方提供的工具函数,用于生成与@InjectRedis()装饰器对应的Token,确保依赖注入的一致性;- 必须确保
RedisModule导出了Redis客户端的提供者,否则MyModule无法找到对应的依赖; - 如果使用命名客户端,需要在
NestRedisModule.forRootAsync的配置中指定name,并在getRedisToken()中传入相同的名称。
内容的提问来源于stack exchange,提问作者DmytroB
相关产品推荐
相关产品推荐

