NestJS服务无法注入控制器问题求助
嗨,我之前把NestJS项目迁到Serverless环境时也碰到过类似的注入问题,给你几个实用的排查方向,应该能解决你的问题:
先检查最基础的装饰器是否存在:你的
CreateOrderUseCase类有没有添加@Injectable()装饰器?NestJS的依赖注入系统只认被这个装饰器标记的类,如果漏掉它,Nest根本不会把这个用例当成可注入的服务,控制器自然拿不到实例,就会报undefined。记得要在类上方加上:@Injectable() export class CreateOrderUseCase { // 你的业务逻辑代码 }确认OrdersModule的配置是否完整:你的AppModule已经导入了OrdersModule,但OrdersModule本身得把控制器和用例都注册进去才行。你需要确保OrdersModule里的
controllers数组包含OrderController,providers数组包含CreateOrderUseCase,比如:@Module({ controllers: [OrderController], // 把控制器添加到这里 providers: [CreateOrderUseCase], // 把用例服务添加到这里 }) export class OrdersModule {}要是控制器和用例不在同一个模块,还得把用例所在的模块导入,或者把用例从原模块导出后再引用,但显然你把它们放在OrdersModule里是最合理的选择。
注意Serverless环境的初始化逻辑:如果你用的是NestJS的Serverless适配器(比如AWS Lambda适配器),要确保入口文件里的应用初始化逻辑是正确的。比如在bootstrap函数里要完整创建AppModule并初始化,不能漏掉任何模块加载步骤。举个示例:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { Handler } from 'aws-lambda'; import { createServer, proxy } from 'aws-serverless-express'; let server; async function bootstrap() { const app = await NestFactory.create(AppModule); await app.init(); return app.getHttpAdapter().getInstance(); } export const handler: Handler = async (event, context) => { if (!server) { server = createServer(await bootstrap()); } return proxy(server, event, context, 'PROMISE').promise; };要是这里的bootstrap没有正确初始化AppModule,模块里的服务和控制器就没法被Nest正确加载,也会导致注入失败。
你可以先从这几个点逐一排查,应该能快速找到问题所在~
备注:内容来源于stack exchange,提问作者Roger González Hermosa

