NestJS中能否从控制器访问NestApplication实例?
如何在NestJS控制器中访问NestApplication?
我的代码文件
main.ts
async function bootstrap() { const app = await NestFactory.create(AppModule); app.enableCors(); app.setGlobalPrefix('api'); app.useGlobalPipes(new ValidationPipe()); await app.listen(process.env.PORT || 3000); } bootstrap();
test-controller.ts
@Controller('data-generator') export class DataGeneratorController { // 这样行不通 constructor(private readonly app: NestApplication) { } @Post('test') async test() { console.log(this.app) return 'Test injecting NestApplication'; } }
遇到的错误
尝试在控制器构造函数中注入NestApplication时,抛出错误:
Nest can't resolve dependencies of the DataGeneratorController (?). Please make sure that the argument NestApplication at index [0] is available in the DataGeneratorModule context
解决方法
方法1:注入INestApplication抽象接口(推荐)
NestJS的依赖注入体系优先支持抽象接口而非具体类,直接注入INestApplication即可解决依赖解析问题:
import { Controller, Post, INestApplication } from '@nestjs/common'; @Controller('data-generator') export class DataGeneratorController { constructor(private readonly app: INestApplication) {} @Post('test') async test() { console.log(this.app); return '成功注入INestApplication'; } }
方法2:手动注册NestApplication实例为模块提供者
如果必须使用NestApplication具体类,需要在对应模块中手动注册该实例:
- 先在
main.ts中导出创建好的app实例:
export let app: NestApplication; async function bootstrap() { app = await NestFactory.create(AppModule); app.enableCors(); app.setGlobalPrefix('api'); app.useGlobalPipes(new ValidationPipe()); await app.listen(process.env.PORT || 3000); } bootstrap();
- 在
DataGeneratorModule中注册该实例为提供者:
import { Module } from '@nestjs/common'; import { NestApplication } from '@nestjs/core'; import { app } from '../main'; import { DataGeneratorController } from './test-controller'; @Module({ controllers: [DataGeneratorController], providers: [ { provide: NestApplication, useValue: app, }, ], }) export class DataGeneratorModule {}
注意:方法1更符合NestJS的设计原则,依赖抽象而非具体实现,能提升代码的可维护性和扩展性。
内容的提问来源于stack exchange,提问作者OMartinez-NeT
相关产品推荐
相关产品推荐

