node.js - AWS lambda 函数在超时错误后停止工作

标签 node.js amazon-web-services aws-lambda

我有一个简单的 lambda 函数,它异步进行 API 调用,然后返回数据。 99% 的时间这都很好。当 API 花费的时间超过 lambda 配置的超时时间时,它会按预期给出错误。现在的问题是,当我对 lambda 函数进行任何后续调用时,它会永久地给我超时错误。

 "errorMessage": "2016-05-14T22:52:07.247Z {session} Task timed out after 3.00 seconds"

为了测试是否是这种情况,我将 lambda 超时设置为 3 秒,并有办法在 lambda 中触发这两个函数。

Javascript

function now() { 
    return response.tell('success'); 
}

function wait() {
    setTimeout(function() { return response.tell('success'); }, 4000);
}

当我调用 now 函数时没有问题。当我调用 wait 函数时,我得到了超时错误,然后对 now 的任何后续调用都会给我同样的错误。

这是预期的行为吗?我认为对 lambda 函数的任何后续调用都应该有效。我知道我总是可以增加配置超时,但宁愿不要。

最佳答案

你应该看看你的函数句柄是如何与特定的 context.callbackWaitsForEmptyEventLoop

如果该 bool 类型为 false,则永远不会触发 setTimeout,因为您之前可能已经回答/处理了 lambda 调用。 但如果 callbackWaitsForEmptyEventLoop 的值为 true - 那么您的代码将执行您正在寻找的操作。

另外 - 通过回调直接处理所有事情可能更容易,无需“手写”超时、更改配置超时等...

例如

function doneFactory(cb) { // closure factory returning a callback function which knows about res (response)
  return function(err, res) {
    if (err) {
      return cb(JSON.stringify(err));
    }
    return cb(null, res);
  };
}

// you're going to call this Lambda function from your code
exports.handle = function(event, context, handleCallback) {

  // allows for using callbacks as finish/error-handlers
  context.callbackWaitsForEmptyEventLoop = false;

  doSomeAsyncWork(event, context, doneFactory(handleCallback));
};

关于node.js - AWS lambda 函数在超时错误后停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37232827/

相关文章:

javascript - 将 Base64 图像字符串转换回文件以发送到 Parse upload

node.js - 如何检查 Node express中间件上变量的内容(调试)

ios - Amazon S3 iOS SDK v2 使用 AWSAccessKeyId :Signature 上传

javascript - Sequelize JS - 在连接中选择 On 子句

javascript - 测试/检查变量的限制是什么?

amazon-web-services - 在AWS DynamoDB中使用batchGetItem与迭代getItem有什么不同的优势吗?

java - AWS 无法验证提供的访问凭证

node.js - 从Node.js中的AWS Lambda函数返回的正确方法是什么?

amazon-web-services - 重新部署 lambda 后,AWS Lex 访问被拒绝。错误的默认 IAM 角色

amazon-web-services - 如何调用函数的 AWS Lambda 权限列表