如何将main.ts中创建的NestJS应用实例注入模块服务?
如何在NestJS服务中访问由NestFactory创建的app实例?
我已经有基础的NestJS启动配置:
async function bootstrap() { const app = await NestFactory.create(AppModule); app.enableCors(corsOptions); app.useGlobalPipes( new ValidationPipe({ validateCustomDecorators: true, transform: true, whitelist: true, exceptionFactory: exceptionFactory, }), ); app.useGlobalFilters(new CustomExceptionsFilter()); const port = parseInt(process.env.PORT); await app.listen(port); }
想知道能不能从其他模块的服务中直接访问这个由NestFactory.create创建的app变量?比如在下面的TestService中注入该实例:
@Injectable() export class TestService { constructor( ... ) {} async useApp(): Promise<any> { const app = ... // 使用从AppModule创建的注入式app实例 } }
我试过导入AppModule重新创建NestFactory,但这样会造成冗余,想找更合理的方式。
解决方案
1. 直接注入INestApplication实例
NestJS框架本身会自动将INestApplication实例注册到依赖注入容器中,你可以直接通过构造函数注入:
import { Injectable, Inject, INestApplication } from '@nestjs/common'; @Injectable() export class TestService { constructor( @Inject(INestApplication) private readonly app: INestApplication ) {} async useApp(): Promise<any> { // 直接使用this.app即可,和bootstrap里的app是同一个实例 console.log(this.app.getUrl()); // 比如获取其他服务实例、操作app配置等 const someService = this.app.get(SomeOtherService); } }
2. 自定义全局提供者(可选)
如果需要更明确的令牌标识,或者要在全局范围内共享app实例,也可以在bootstrap中手动注册一个自定义提供者:
async function bootstrap() { const app = await NestFactory.create(AppModule); // 注册全局提供者 app.provider('APP_INSTANCE', { useValue: app }); // 其他配置... await app.listen(port); }
然后在服务中通过自定义令牌注入:
import { Injectable, Inject } from '@nestjs/common'; @Injectable() export class TestService { constructor( @Inject('APP_INSTANCE') private readonly app: INestApplication ) {} async useApp(): Promise<any> { // 使用this.app } }
注意事项
- 尽量避免过度依赖app实例,NestJS的依赖注入机制已经能满足大部分场景,直接注入所需的服务会更符合模块化设计原则。
- 如果只是需要访问容器中的其他服务,直接通过构造函数注入对应的服务即可,不需要通过app实例间接获取。
内容的提问来源于stack exchange,提问作者diegoolavarriau
相关产品推荐
相关产品推荐

