【发布时间】:2018-10-22 06:56:44
【问题描述】:
我有一个 Node.js 8.10 Lambda。它响应对我的 API 网关的 POST 请求。
我想:
- 响应用户。
- 等待 3.5 分钟。
- 做些有用的事。
我的代码是这样的:
function handler(event, context, lambdaCallback) {
//210000 milliseconds is 3.5 minutes
let timeToWait = 210000;
//respond to the caller and continue to process the request
lambdaCallback(null, {"message": "process started"});
setTimeout(() => {
doSomethingUseful();
}, timeToWait);
}
doSomethingUseful() 在所有情况下都会在指定的超时后运行。
问题是我没有得到回应。我认为 API 网关响应超时会终止响应 - 通常我会得到:{ "message": "Endpoint request timed out" }。
我认为 API 网关响应超时会终止响应,因为如果我将 timeToWait 减少到一个微不足道的值,我会得到预期的响应 ({"message": "process started"})。
关于如何在 setTimeout 结束之前发送快速响应的任何想法?
【问题讨论】:
-
你应该重新设计这个。也许您的 Lambda 可以将消息排入队列并立即响应用户。异步地,另一个进程将处理与排队消息相关的工作。这可能是计划的 Lambda(例如,每 5 分钟醒来一次并寻找工作)和 SQS 或其他东西的组合。
-
在 Lambda 函数完成之前,您无法返回响应。提前调用回调不会改变这一点。
-
@sqlbot 感谢您的回复。我对 AWS 文档的声明感到困惑,即“当回调被调用(显式或隐式)时,AWS Lambda 会继续调用 Lambda 函数,直到事件循环为空。” link。我以为它会在调用时调用
callback。显然这是错误的。我现在把它读作“你可以随时调用callback,但在函数完成之前它不会触发。”再次感谢您花时间提供帮助。一个下来,一百万去。 . . :)
标签: node.js amazon-web-services aws-lambda aws-api-gateway