如果在不同的上下文中调用回调,则简单的AWS Lambda响应为null

时间:2019-01-28 19:50:23

标签: node.js aws-lambda

我在运行使用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

现在在我看来,这就像一个非常基本的功能,我只是假设我在这里遗漏了一些东西。谁能帮我查明我的错误?或说明即使在不同的上下文中调用了回调,响应值如何也可以包含所需的值? 谢谢!

Synchronous code with working result Asynchronous code with null response Test event - empty JSON object

更新#1 使用promise再次测试了一次:

Another test with promise

1 个答案:

答案 0 :(得分:0)

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

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

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