Nest.js中如何注册RedisModule?遇到依赖解析报错该怎么解决?
报错原因
你使用的第三方nestjs-redis包已停止维护,无法适配Nest.js v8及以上版本的依赖注入规则,因此会出现ModuleRef无法在RedisCoreModule上下文找到的错误。
修复方案
方案1:使用官方维护的Redis集成包(推荐)
官方现已推出基于ioredis的活跃维护集成包,适配所有主流Nest版本,操作步骤如下:
- 安装依赖
npm install @nestjs-modules/ioredis ioredis - 修改AppModule注册逻辑
@Module({ imports: [ RedisModule.forRoot({ type: 'single', options: { host: host, port: 6379, // 如需密码验证可添加 password: 你的密码 字段 }, }), ], }) export class AppModule {}
- 业务中注入使用示例
import { Injectable } from '@nestjs/common'; import { InjectRedis } from '@nestjs-modules/ioredis'; import Redis from 'ioredis'; @Injectable() export class YourService { constructor(@InjectRedis() private readonly redis: Redis) {} async setCache(key: string, value: string, expireSecond: number) { return this.redis.set(key, value, 'EX', expireSecond); } }
方案2:手动封装Redis客户端(灵活可控)
如果需要更灵活的自定义配置,可以自行封装ioredis,无需依赖第三方集成包:
- 安装ioredis依赖
npm install ioredis - 编写全局Redis模块
// src/common/redis/redis.module.ts import { Module, Global } from '@nestjs/common'; import Redis from 'ioredis'; @Global() @Module({ providers: [ { provide: 'REDIS_CLIENT', useFactory: () => { return new Redis({ host: host, port: 6379, // 其他自定义配置 }); }, }, ], exports: ['REDIS_CLIENT'], }) export class RedisModule {}
- 在AppModule中引入
@Module({ imports: [RedisModule], }) export class AppModule {}
- 业务中注入使用
import { Injectable, Inject } from '@nestjs/common'; import Redis from 'ioredis'; @Injectable() export class YourService { constructor(@Inject('REDIS_CLIENT') private readonly redis: Redis) {} }
不建议的兼容方案
如果一定要用旧的nestjs-redis包,需要将Nest全家桶版本降级到v7及以下,该方案存在安全漏洞和后续兼容性隐患,不推荐使用。
内容的提问来源于stack exchange,提问作者Alice
相关产品推荐
相关产品推荐

