NestJS缓存管理器如何传入REDIS_URI以适配Heroku
NestJS 缓存管理器传入 REDIS_URI 参数的实现方式
核心逻辑
cache-manager-redis-store 底层基于原生 node-redis 客户端实现,支持透传所有客户端原生连接参数,不需要手动拆分 host、port、密码等配置项,可直接接收完整的 Redis 连接 URI,适配 Heroku 这类平台自动注入 REDIS_URI 环境变量的使用场景。
基础实现
官方文档示例中拆分 host、port 参数的写法只是基础配置形式,实际可直接把完整的 REDIS_URI 作为 url 字段传入配置:
import * as redisStore from 'cache-manager-redis-store'; import { CacheModule, Module } from '@nestjs/common'; import { AppController } from './app.controller'; @Module({ imports: [ CacheModule.register({ store: redisStore, // 读取环境变量中的完整 Redis 连接串 url: process.env.REDIS_URI, // 通用配置:默认缓存过期时间,单位为秒 ttl: 300, // 全局开启缓存,其他模块无需重复注入 isGlobal: true, }), ], controllers: [AppController], }) export class AppModule {}
异步配置场景写法
如果项目使用 @nestjs/config 统一管理环境变量,推荐用异步注册方式加载配置,避免启动时环境变量未完成加载导致的连接异常:
import * as redisStore from 'cache-manager-redis-store'; import { CacheModule, Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { AppController } from './app.controller'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), CacheModule.registerAsync({ isGlobal: true, inject: [ConfigService], useFactory: (configService: ConfigService) => ({ store: redisStore, url: configService.get<string>('REDIS_URI'), ttl: 300, }), }), ], controllers: [AppController], }) export class AppModule {}
兼容性处理
如果使用的是较老版本的 cache-manager-redis-store,无法直接识别 url 参数,可手动解析 URI 为拆分的配置项传入:
import * as redisStore from 'cache-manager-redis-store'; import { URL } from 'url'; // 解析完整 REDIS_URI 为独立配置项 const redisConnectionUri = new URL(process.env.REDIS_URI); CacheModule.register({ store: redisStore, host: redisConnectionUri.hostname, port: Number(redisConnectionUri.port), password: redisConnectionUri.password, // 解析连接串中的数据库编号,如 redis://xxx:6379/2 对应 db: 2 db: Number(redisConnectionUri.pathname.slice(1) || 0), ttl: 300, })
注意事项
- Heroku 托管的 Redis 服务默认开启 TLS 加密,使用 URI 直传方式时,底层客户端会自动识别连接串中的 TLS 标识,不需要额外手动配置 tls 相关参数
- 如果出现连接失败问题,先确认
REDIS_URI的格式是否符合标准规范:redis://[用户名]:[密码]@[主机地址]:[端口]/[数据库编号]
内容的提问来源于stack exchange,提问作者Êmerson Felinto
相关产品推荐
相关产品推荐

