AWS Lambda 上的 Nestjs(无服务器框架)|如何访问事件参数?

Posted

技术标签:

【中文标题】AWS Lambda 上的 Nestjs(无服务器框架)|如何访问事件参数?【英文标题】:Nestjs on AWS Lambda (Serverless Framework) | How to access the event parameter? 【发布时间】:2021-03-20 16:14:39 【问题描述】:

我在 AWS Lambda 上托管 Nestjs 应用程序(使用无服务器框架)。 请注意,实施在 AWS API Gateway 之后。

问题:如何访问我的 Nest controller 中的 event 参数?

这就是我引导 NestJS 服务器的方式:

import  APIGatewayProxyHandler  from 'aws-lambda';
import  NestFactory  from '@nestjs/core';
import  AppModule  from './app.module';
import  Server  from 'http';
import  ExpressAdapter  from '@nestjs/platform-express';
import * as awsServerlessExpress from 'aws-serverless-express';
import * as express from 'express';

let cachedServer: Server;

const bootstrapServer = async (): Promise<Server> => 
    const expressApp = express();
    const adapter = new ExpressAdapter(expressApp);
    const app = await NestFactory.create(AppModule, adapter);
    app.enableCors();
    await app.init();
    return awsServerlessExpress.createServer(expressApp);


export const handler: APIGatewayProxyHandler = async (event, context) => 
    if (!cachedServer) 
        cachedServer = await bootstrapServer()
    
    return awsServerlessExpress.proxy(cachedServer, event, context, 'PROMISE')
        .promise;
;

这是一个控制器中的一个函数:

@Get()
getUsers(event)  // <-- HOW TO ACCESS event HERE?? This event is undefined.
    return 
        statusCode: 200,
        body: "This function works and returns this JSON as expected."
    

我很难理解如何访问 event 参数,它可以在“普通”节点 12.x Lambda 函数中轻松访问:

module.exports.hello = async (event) => 
    return 
        statusCode: 200,
        body: 'In a normal Lambda, the event is easily accessible, but in NestJS its (apparently) not.'
    ;
; 

【问题讨论】:

【参考方案1】:

解决方案:

在引导期间将 AwsExpressServerlessMiddleware 添加到您的设置中:

const awsServerlessExpressMiddleware = require('aws-serverless-express/middleware')
app.use(awsServerlessExpressMiddleware.eventContext())

注意:app.use 应该在之前 app.init()

现在可以访问eventcontext 对象:

var event = req.apiGateway.event;
var context = req.apiGateway.context;

致谢:This answer on SO

【讨论】:

以上是关于AWS Lambda 上的 Nestjs(无服务器框架)|如何访问事件参数?的主要内容,如果未能解决你的问题,请参考以下文章

外部 Http 调用上的无服务器框架/Lambda 错误

使用无服务器和 chrome-aws-lambda 节点包在 AWS Lambda 上找不到 Chrome 二进制文件

无服务器/AWS-Lambda 设置的 graphiql UI 损坏

AWS Lambda&Fargate 无服务底层技术是如何实现的

AWS 无服务器架构 – 为啥要使用 API 网关?

AWS 无服务器 Java Lambda 调试