繁体   English   中英

AWS上的NodeJS EventEmitter中的异步function Lambda

[英]Async function in NodeJS EventEmitter on AWS Lambda

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

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

我的理解是这样的:

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

这在本地工作,因为我的 NodeJS 进程一直在运行,并且事件循环上的任何剩余事件都得到了处理。 奇怪的是,这似乎不适用于 AWS Lambda。 即使context.callbackWaitsForEmptyEventLoop设置为 true。

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

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

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

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

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

最后,我使用await-event-emitter解决了这个问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM