【发布时间】:2019-01-29 05:44:41
【问题描述】:
我在运行一些使用 AWS Lambda 和 NodeJS 编写的代码时遇到问题。我花了一些时间来缩小我的问题,但最终我注意到,如果我从与处理函数上下文不同的上下文调用回调函数,那么响应值为 null。
这是我用来测试的简单函数
exports.handler = async (event, context, callback) => {
callback (null,{
statusCode: 201,
headers: {
"Content-Type": "text/html"
},
body: {}
});
}
如果我使用此代码运行测试事件(测试脚本是空 JSON),那么结果很简单:
Response:
{
"statusCode": 201,
"headers": {
"Content-Type": "text/html"
},
"body": {}
}
但是如果我只强制回调函数在不同的上下文中调用,如下例所示:
exports.handler = async (event, context, callback) => {
setTimeout(function() {
callback (null,{ // <-- callback is now called in timer context
statusCode: 201,
headers: {
"Content-Type": "text/html"
},
body: {}
})}, 5000);
}
然后运行完全相同的测试事件(空 JSON)现在会导致空响应:
Response:
null
现在在我看来这是一个非常基本的功能,我只是假设我在这里遗漏了一些东西。任何人都可以帮助查明我的错误吗?或解释即使在不同的上下文中调用回调,响应值如何包含所需的值? 谢谢!
更新 #1 使用 Promise 再次测试:
【问题讨论】:
-
问题缺少stackoverflow.com/help/mcve。这完全取决于您如何使用该功能。它不依赖于“上下文”。片段 1 是同步的。片段 2 是异步的。你不使用承诺,所以
async没有任何好处。 -
感谢您的反馈,但怎么会缺少任何信息?我提到我只使用空 JSON 对象使用 Lambda 中的内置测试事件功能对其进行测试。您可以在不到 2 分钟的时间内自行重新创建它。
-
是的,你是对的——一个版本是同步的,另一个是异步的。我希望两者都能工作,但异步方法不能。我不知道为什么,这就是我在这里寻求帮助的原因
-
我明白了,所以该函数直接提供给 Lambda。我自己不使用 Lambda,但在这种情况下我希望它能够理解
callback参数。您是否尝试遵守承诺并从async返回值而不是使用回调? -
谢谢@estus 我刚刚尝试使用一个承诺,并在问题详细信息中添加了一个截图(在底部)。它仍然不起作用,响应为空......
标签: node.js aws-lambda