1

我在 nodejs4.x 运行时有一个 lambda 函数。如果我的脚本由于错误而停止执行,假设我尝试获取.length未定义的对象,那么我无法再次启动脚本。它甚至不像脚本运行并遇到相同的错误,脚本没有运行。lambda 处理程序函数永远不会被第二次调用。

此 lambda 函数是 Amazon Alexa 的终端节点。当我重新上传代码(一个 zip 文件)时,系统会再次运行。

这是nodejs的一些行为吗?脚本是否过早地损坏了文件,因此无法重新启动?

当服务器遇到错误时,我收到此消息Process exited before completing request

然后后续请求达到超时限制。

重要编辑 我已将问题确定为 NPM 请求。模块没有完成加载即。

console.log('i see this message');
var request = require('request');
console.log('this never happens');
4

4 回答 4

1

我知道的几件事:

  1. 如果 lambda 调用失败,由于某种原因,会再次调用(实际上最多重试 3 次)。但是,这仅适用于异步调用,有两种类型的调用

  2. 您的 lambda 代码所需的任何外部模块都必须包含在您部署到 lambda 的包中,我已在此处简单解释了这一点


您可以编写访问未定义变量属性的代码,是的,它会抛出异常,如果此调用是异步的,它将再重试 2 次——当然这也会失败。

于 2016-08-31T20:02:04.907 回答
0

所以在通过他们的论坛联系 AWS 之后,结果证明这是一个错误。错误时不会清除容器,因此必须重新上传代码。

一种解决方案是制作一个 cloudwatch 警报,该警报会触发另一个 lambda 函数,该函数会自动重新上传代码。

他们正在努力解决问题。

论坛帖子:https ://forums.aws.amazon.com/thread.jspa?threadID=238434&tstart=0

于 2016-09-02T22:21:39.647 回答
0

事实上,Lambda 变得无响应的情况有很多,例如:

  1. 解析无效的 json:

    exports.handler = function(event, context, callback)
    {
        var nonValidJson = "Not even Json";
        var jsonParse = JSON.parse(nonValidJson);
    
  2. 访问未定义变量的属性:

    exports.handler = function(event, context, callback)
    {
        var emptyObject = {};
        var value = emptyObject.Item.Key;
    
  3. 访问 RDS 后不关闭 mySql 连接会导致 Lambda 超时,然后它变得无响应。

制作一个重新上传代码的 lambda 可能需要一些时间。经过一些测试,发现实际上 Lambda 尝试重新启动(重新加载容器?),只是时间不够。如果您将超时设置为 10 秒,则在大约 4 秒的执行时间后,Lambda 开始工作,然后在下一次运行中正常运行。我也尝试过设置:

context.callbackWaitsForEmptyEventLoop = false;

并将所有“需要”块放在处理程序中,没有任何效果。因此,防止 Lambda 死机的好方法是设置更大的超时时间,10 秒应该足以作为针对此错误的解决方法保护。

于 2017-06-07T21:22:40.077 回答
0

由于调用时Lambda函数失败,require('request')我认为该项目没有正确部署。请求必须与 Lambda 函数一起部署,因为它不是Node.js 4.3.2(当前 Lambda JavaScript 运行时)的一部分。

确保:

  1. require被添加到您的package.json文件中(例如,通过调用$ npm install require --save,请参阅npm install了解详细信息)。
  2. 您可以通过压缩项目文件夹(包括文件夹)来创建部署包node_modules
  3. 部署 .zip 已上传到您的 Lambda 函数。
于 2016-09-01T20:08:21.380 回答