NestJS项目本地正常,部署至AWS Lambda后调用报错求助
NestJS部署AWS Lambda后依赖注入失败问题
本地运行正常的NestJS后端,部署到AWS Lambda后出现以下错误:
2025-05-30T02:20:27.823Z cd8132bf-b0fc-4e36-94bd-911a35996ed4 INFO TypeError: Cannot read properties of undefined (reading 'getAllCategories') at CategoryController.getAllCategories (/src/dashboard/modules/category/category.controller.ts:29:41) at <anonymous> (/node_modules/@nestjs/core/router/router-execution-context.js:38:29) at InterceptorsConsumer.intercept (/node_modules/@nestjs/core/interceptors/interceptors-consumer.js:12:20) at <anonymous> (/node_modules/@nestjs/core/router/router-execution-context.js:46:60) at <anonymous> (/node_modules/@nestjs/core/router/router-proxy.js:9:23) at Layer.handle (/node_modules/express/lib/router/layer.js:95:5) at next (/node_modules/express/lib/router/route.js:149:13) at Route.dispatch (/node_modules/express/lib/router/route.js:119:3) at Layer.handle (/node_modules/express/lib/router/layer.js:95:5) at <anonymous> (/node_modules/express/lib/router/index.js:284:15)
我的配置文件
serverless.yml
service: servicesapi frameworkVersion: '4' provider: name: aws runtime: nodejs18.x architecture: arm64 region: sa-east-1 stage: production memorySize: 2048 timeout: 15 logRetentionInDays: 1 httpApi: cors: allowedOrigins: - '*' allowedMethods: - GET - POST - PUT - PATCH - DELETE - OPTIONS allowedHeaders: - Content-Type - Authorization functions: api: handler: src/lambda.handler events: - httpApi: path: /{proxy+} method: ANY plugins: - serverless-offline build: esbuild: bundle: true target: node18 platform: node external: - '@nestjs/microservices' - '@nestjs/microservices/microservices-module' - '@nestjs/websockets' - '@nestjs/websockets/socket-module' - 'aws-sdk' package: exclude: - .git/** - .vscode/** - node_modules/** - test/**
lambda.ts
import { configure as serverlessExpress } from '@vendia/serverless-express'; import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; let cachedServer; export const handler = async (event, context) => { if (!cachedServer) { const nestApp = await NestFactory.create(AppModule); await nestApp.init(); cachedServer = serverlessExpress({ app: nestApp.getHttpAdapter().getInstance(), }); } return cachedServer(event, context); };
问题说明
已检查CategoryController和CategoryService的@Injectable、@Controller装饰器,模块导入逻辑也无问题,本地运行完全正常。需要调整哪些构建或部署配置才能让项目在AWS上正常运行?
相关文件截图:
- CategoryController:

- CategoryService:

解决方案
1. 修复ESBuild元数据保留配置
NestJS依赖装饰器元数据实现依赖注入,ESBuild默认会移除这些元数据,导致注入失败。在serverless.yml的build.esbuild中添加keepNames: true保留类名与装饰器元数据:
build: esbuild: bundle: true target: node18 platform: node keepNames: true # 关键:保留装饰器元数据和类名 sourcemap: true # 可选:用于Lambda调试 external: - '@nestjs/microservices' - '@nestjs/microservices/microservices-module' - '@nestjs/websockets' - '@nestjs/websockets/socket-module' - 'aws-sdk'
2. 修正package排除规则
当前package.exclude中包含node_modules/**,但ESBuild的bundle: true已将必要依赖打包进产物,排除整个node_modules可能导致部分依赖缺失,修改为:
package: exclude: - .git/** - .vscode/** - test/**
3. 优化Lambda初始化逻辑
添加context.callbackWaitsForEmptyEventLoop = false避免Lambda冷启动后挂起,同时确保Nest应用初始化完整:
import { configure as serverlessExpress } from '@vendia/serverless-express'; import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; let cachedServer; export const handler = async (event, context) => { // 防止Lambda等待空事件循环导致挂起 context.callbackWaitsForEmptyEventLoop = false; if (!cachedServer) { const nestApp = await NestFactory.create(AppModule); nestApp.enableCors(); // 与serverless.yml的CORS配置保持一致 await nestApp.init(); cachedServer = serverlessExpress({ app: nestApp.getHttpAdapter().getInstance(), }); } return cachedServer(event, context); };
4. 确认模块导入配置
确保CategoryModule正确注册控制器与服务,且被AppModule导入:
// category.module.ts示例 import { Module } from '@nestjs/common'; import { CategoryController } from './category.controller'; import { CategoryService } from './category.service'; @Module({ controllers: [CategoryController], providers: [CategoryService], }) export class CategoryModule {}
5. 本地模拟Lambda调试
使用serverless offline在本地模拟Lambda环境,复现问题并调试:
sls offline start
内容的提问来源于stack exchange,提问作者DavidIjsud
相关产品推荐
相关产品推荐

