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', ...);
我有一个基于包含 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', ...);