使用CacheModule.register集成Redis时NestJS出现类型错误
NestJS集成Redis时CacheModule.register类型错误解决办法
问题场景
使用CacheModule(来自@nestjs/common)和cache-manager-redis-store包在NestJS中集成Redis时,为CacheModule.register的store属性赋值redisStore出现类型错误。
报错代码
import { Module, CacheModule } from "@nestjs/common"; import { AuthModule } from "./auth/auth.module"; import { MongooseModule } from "@nestjs/mongoose"; import { EnvConfiguration } from "./config/env.config"; import { ConfigModule } from "@nestjs/config"; import { redisStore } from "cache-manager-redis-store"; @Module({ imports: [ ConfigModule.forRoot({ load: [EnvConfiguration], }), MongooseModule.forRoot(process.env.MONGODB), AuthModule, CacheModule.register({ store: redisStore, // 错误发生位置 host: "localhost", port: 6379, }), ], controllers: [], providers: [], }) export class AppModule {}
错误信息
(property) store: (string | CacheStoreFactory | CacheStore) & ((config: RedisClientOptions<RedisModules, RedisFunctions, RedisScripts> & Config) => Promise<...>) Cache manager. The default value is 'memory' (memory storage). See Different Stores for more information. Type '(config: RedisClientOptions<RedisModules, RedisFunctions, RedisScripts> & Config) => Promise<RedisStore>' cannot be assigned to type '(string | CacheStoreFactory | CacheStore) & ((config: RedisClientOptions<RedisModules, RedisFunctions, RedisScripts > & Configuration) => Promise<...>)'. Type '(config: RedisClientOptions<RedisModules, RedisFunctions, RedisScripts> & Config) => Promise<RedisStore>' cannot be assigned to type 'string & ((config: RedisClientOptions<RedisModules, RedisFunctions, RedisScripts> & Config) => Promise<...>)'. Type '(config: RedisClientOptions<RedisModules, RedisFunctions, RedisScripts> & Config) => Promise<RedisStore>' cannot be assigned to type 'string'.ts(2322)
解决办法
方法一:使用异步注册(推荐)
redisStore返回的是一个Promise,同步的register方法无法正确处理异步的store工厂,改用CacheModule.registerAsync通过useFactory处理异步逻辑:
import { Module } from "@nestjs/common"; import { AuthModule } from "./auth/auth.module"; import { MongooseModule } from "@nestjs/mongoose"; import { EnvConfiguration } from "./config/env.config"; import { ConfigModule } from "@nestjs/config"; import { CacheModule } from "@nestjs/common"; import { redisStore } from "cache-manager-redis-store"; @Module({ imports: [ ConfigModule.forRoot({ load: [EnvConfiguration], }), MongooseModule.forRoot(process.env.MONGODB), AuthModule, CacheModule.registerAsync({ useFactory: async () => ({ store: await redisStore({ host: "localhost", port: 6379, }), }), }), ], controllers: [], providers: [], }) export class AppModule {}
方法二:类型断言(临时方案)
如果必须使用同步注册,可以通过类型断言强制转换redisStore的类型,不过这种方法可能隐藏真实类型问题,不推荐长期使用:
import { Module, CacheModule, CacheStoreFactory } from "@nestjs/common"; // 其他导入不变 CacheModule.register({ store: redisStore as unknown as CacheStoreFactory, host: "localhost", port: 6379, }),
方法三:升级到官方推荐的@nestjs/cache-manager模块
NestJS v10及以上版本推荐使用@nestjs/cache-manager模块(适配cache-manager v5+),步骤如下:
- 安装依赖:
npm install @nestjs/cache-manager cache-manager cache-manager-redis-store
- 修改代码:
import { Module } from "@nestjs/common"; import { AuthModule } from "./auth/auth.module"; import { MongooseModule } from "@nestjs/mongoose"; import { EnvConfiguration } from "./config/env.config"; import { ConfigModule } from "@nestjs/config"; import { CacheModule } from "@nestjs/cache-manager"; // 替换导入路径 import { redisStore } from "cache-manager-redis-store"; @Module({ imports: [ ConfigModule.forRoot({ load: [EnvConfiguration], }), MongooseModule.forRoot(process.env.MONGODB), AuthModule, CacheModule.registerAsync({ useFactory: async () => { const store = await redisStore({ host: "localhost", port: 6379, }); return { store: store, }; }, }), ], controllers: [], providers: [], }) export class AppModule {}
错误原因
redisStore是一个返回Promise的异步函数,而同步的CacheModule.register期望的store类型是字符串、同步工厂函数或已实例化的store实例,无法直接兼容异步返回的函数,因此触发类型不匹配错误。
内容的提问来源于stack exchange,提问作者Luciano Pulido
相关产品推荐
相关产品推荐

