【问题标题】:Simple AWS Lambda response is null if callback is called in different context如果在不同的上下文中调用回调,简单的 AWS Lambda 响应为空
【发布时间】: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


【解决方案1】:

您的代码将在调用回调之前立即返回。这就是它在第一个示例中起作用的原因。

尝试将await 添加到Promise 示例的前面,以便节点在继续之前完成工作。

const value = await delay(5000)
callback(null, value)

【讨论】:

  • 谢谢。我尝试按照您的建议添加等待。我根据我的尝试编辑了你建议的代码,它确实有效。那谢谢啦!现在我将尝试将此应用于我原来的问题,看看它是如何工作的:)
猜你喜欢
  • 2018-06-03
  • 2020-04-21
  • 2018-12-13
  • 2019-08-03
  • 2018-10-04
  • 2020-12-20
  • 2020-01-30
  • 2015-10-13
  • 2016-11-28
相关资源
最近更新 更多