You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:Category controller
  • CategoryService:category service

解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:06:08