Nest.js中如何在main.ts函数内复用已配置的RedisService
核心实现逻辑
不需要在main.ts里手动重新实例化RedisService。Nest应用创建完成后自带完整的依赖注入容器,所有在模块里注册的、已经配好连接参数的RedisService单例,都可以直接从容器里取出来用,完全不用重复传密码、连接地址这类配置。
具体操作步骤
- 前置校验
既然你写的业务类已经能通过构造函数注入拿到RedisService,说明这个服务本身已经在项目的某个Nest模块里被注册为provider,初始化时的连接配置也早就传好了。只要确保这个服务在对应模块里被正确导出就行——如果是全局@Global()模块里注册的服务,直接就能被全局访问;如果是普通模块注册的,要把RedisService加到模块的exports数组里,不然上层容器拿不到。 - 替换手动实例化的逻辑
等NestFactory.create()把所有模块初始化完成后,调用app.get(RedisService)就能拿到已经配好的单例,拿到的实例和你在业务类构造器里注入的完全是同一个对象,不需要传任何参数。
修正后的main.ts代码
import { AppModule } from './app.module'; import { RedisService } from 'custom-redis-package'; import * as session from 'express-session'; async function bootstrap() { // 创建应用的过程中会自动完成所有模块的依赖初始化,包括带完整配置的RedisService const app = await NestFactory.create(AppModule); // 从DI容器直接取已初始化的单例,无重复配置 const redisService = app.get(RedisService); app.use( session({ secret: 'secret', resave: false, saveUninitialized: false, store: redisService.getSessionStorage(session), }), ); await app.listen(3000); } bootstrap();
常见踩坑提醒
- 必须等
NestFactory.create()执行完成、所有模块依赖初始化完之后,再调用app.get()拿服务,不能在应用创建前调用,否则会报依赖不存在的错误。 - 拿到的RedisService和业务代码注入的是同一个实例,不会额外创建新的Redis连接,也不存在配置不一致的问题。
- 如果你的项目用了自定义的注入token注册RedisService,只需要把
app.get()里的参数换成对应的token就行,逻辑完全一样。
内容的提问来源于stack exchange,提问作者Alex Ironside
相关产品推荐
相关产品推荐

