AWS Lambda 上 NodeJS EventEmitter 中的异步函数

Async function in NodeJS EventEmitter on AWS Lambda

我有一个基于包含 EventEmitter 的外部库构建的 AWS Lambda 应用程序。在某个事件中,我需要发出 HTTP 请求。所以我正在使用这段代码(简化):

myEmitter.on("myEvent", async() => {
    setup();
    await doRequest();
    finishingWork();
});

我的理解是这样的:

我的处理程序被调用,但是一旦 doRequest 函数被调用,就会返回一个 Promise 并且 EventEmitter 继续处理下一个处理程序。完成所有这些后,处理程序的工作可以继续 (finishingWork)。

这在本地有效,因为我的 NodeJS 进程保持 运行 并且处理事件循环中的任何剩余事件。奇怪的是,这似乎不适用于 AWS Lambda。即使 context.callbackWaitsForEmptyEventLoop 设置为 true。

在我的日志记录中,我可以看到我的处理程序进入了 doRequest 函数,但在我调用库进行 HTTP 调用(request-promise,它使用 request)之后什么也没有。当我发出另一个请求时,代码不会继续(如果 callbackWaitsForEmptyEventLoop 设置为 false,我会期望它不是)。

有没有人经历过类似的事情并且知道如何在 AWS Lambda 上的 NodeJS 事件发射器的处理程序中执行异步 HTTP 请求?

如果您知道如何解决这个问题,请随时添加另一个答案。但就目前而言,"solution" 对我们来说是将事件处理程序代码放在我们代码库的其他地方。这样就异步执行了。

我们之所以能够做到这一点,是因为只有一个地方会发出事件,但事件处理程序方式会是一种更简洁的解决方案。不幸的是,这似乎是不可能的。

我也有类似的问题,我的事件发射器正常记录所有事件,直到 运行 进入异步函数。它在 ECS 中运行良好,但在 Lambda 中运行良好,因为事件发射器同步运行,但 Lambda 将在响应返回后退出。

最后我用await-event-emitter解决了问题

await emitter.emit('onUpdate', ...);