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

在AWS Lambda(Serverless框架)上的NestJS如何获取event参数?

在NestJS控制器中获取AWS Lambda的Event参数

你遇到的问题其实是因为NestJS基于Express(你这里用了ExpressAdapter),而aws-serverless-express在转发Lambda请求时,会把原生的event和context附加到Express的Request对象上,而不是直接作为控制器方法的参数。下面给你两种实用的解决方案:

方法一:直接通过@Req()装饰器获取

首先导入Nest的@Req()装饰器和Express的Request类型,然后在控制器方法中通过request对象的apiGateway.event属性拿到Lambda的event:

import { Get, Req } from '@nestjs/common';
import { Request } from 'express';

@Get()
getUsers(@Req() req: Request) {
  // 从request对象中取出Lambda原生event
  const lambdaEvent = req.apiGateway?.event;
  
  // 现在你可以用lambdaEvent做任何操作了,比如获取请求头、路径参数等
  return {
    statusCode: 200,
    body: "成功获取到Lambda Event",
    pathParameters: lambdaEvent?.pathParameters,
    queryStringParameters: lambdaEvent?.queryStringParameters
  };
}

方法二:自定义装饰器(更优雅)

如果多个控制器都需要获取Lambda event,自定义一个装饰器会让代码更简洁。创建一个装饰器文件src/decorators/lambda-event.decorator.ts:

import { createParamDecorator, ExecutionContext } from '@nestjs/common';
import { Request } from 'express';

export const LambdaEvent = createParamDecorator(
  (_data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest<Request>();
    return request.apiGateway?.event;
  },
);

然后在控制器中直接使用这个装饰器:

import { Get } from '@nestjs/common';
import { LambdaEvent } from './decorators/lambda-event.decorator';

@Get()
getUsers(@LambdaEvent() event) {
  // 这里的event就是Lambda原生的event参数
  return {
    statusCode: 200,
    body: "通过自定义装饰器获取到Lambda Event",
    eventDetails: {
      httpMethod: event.httpMethod,
      requestContext: event.requestContext
    }
  };
}

为什么普通Lambda能直接拿到event?

普通Node.js Lambda函数是直接处理Lambda的触发事件,参数就是原生的event和context;但NestJS是Web框架,aws-serverless-express把Lambda的请求转换成了标准的HTTP请求,所以原生event被封装到了Express的request对象里,需要通过这种方式取出。

内容的提问来源于stack exchange,提问作者Vingtoft

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:49:54