如何在Nest.js框架外部手动获取provider类的实例
非Nest.js模块调用Nest服务的实现方案
可以无需将product模块改造为Nest.js模块,即可获取到OrderService的实例,常用实现方案有两种:
方案一:导出全局Nest应用实例调用
核心逻辑是在Nest应用初始化完成后,将应用实例挂载导出,对外暴露获取服务的方法:
- 在Nest应用入口文件添加导出逻辑:
// Nest 应用入口文件(如main.ts) import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; let nestAppInstance: Awaited<ReturnType<typeof NestFactory.create>>; async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000); // 初始化完成后赋值全局实例 nestAppInstance = app; } bootstrap(); // 导出通用服务获取方法 export function getNestService<T>(serviceClazz: new (...args: any[]) => T): T { return nestAppInstance.get(serviceClazz); }
- 在非Nest的product模块中直接调用方法获取实例:
// 非Nest开发的product模块代码 import { getNestService } from './main'; import { OrderService } from './order/order.service'; // 直接获取OrderService实例使用 const orderService = getNestService(OrderService); // 调用服务内方法 const userOrders = orderService.getOrderListByUserId(1001);
方案二:单独初始化模块上下文获取
如果不想依赖全局Nest应用的启动状态,可以单独初始化OrderModule的上下文获取服务:
import { NestFactory } from '@nestjs/core'; import { OrderModule } from './order/order.module'; import { OrderService } from './order/order.service'; // 封装独立的OrderService获取方法 async function getOrderServiceInstance() { const orderModuleContext = await NestFactory.createApplicationContext(OrderModule); return orderModuleContext.get(OrderService); } // product模块中调用 const orderService = await getOrderServiceInstance();
注意事项
- 方案一需要保证调用服务时Nest应用已经完成初始化,避免获取到undefined实例,可以增加应用初始化完成的回调逻辑,在回调中启动原有Express业务逻辑
- 方案二需要保证OrderModule的所有依赖都已在模块的
imports、providers配置中正确引入,避免上下文初始化失败 - 调用OrderService方法前请确认其依赖的数据库、第三方服务等资源已完成初始化,避免运行时报错
内容的提问来源于stack exchange,提问作者Michał Terczyński SM
相关产品推荐
相关产品推荐

