我在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');
答案 0 :(得分:1)
我知道的一些事情:
如果lambda调用失败,由于任何原因,它将再次被调用(实际上它将被重试最多3次)。 但是,这仅适用于异步调用,there are two types of invocations。
您的lambda代码所需的任何外部模块必须包含在您部署到lambda I have explained this simply in here的包中。
你可以编写访问未定义变量属性的代码,是的,它会抛出异常,如果这个调用是异步,它将被重试2次 - 当然也会失败。
答案 1 :(得分:0)
由于Lambda函数在调用require('request')
时失败,我认为该项目尚未正确部署。必须使用Lambda函数部署request,因为它不是Node.js 4.3.2(当前Lambda JavaScript运行时)的一部分。
确保:
require
已添加到您的package.json
文件中(例如,通过致电$ npm install require --save
,有关详细信息,请参阅npm install。)node_modules
文件夹)来创建deployment package。答案 2 :(得分:0)
因此,在通过他们的论坛联系AWS后,结果证明这是一个错误。错误时不会清除容器,因此必须重新上载代码。
解决方案是制作一个cloudwatch闹钟,触发另一个自动重新上传代码的lambda函数。
他们正在修复。
论坛帖子:https://forums.aws.amazon.com/thread.jspa?threadID=238434&tstart=0
答案 3 :(得分:0)
事实上,Lambda变得没有反应的情况很多,例如:
解析无效的json:
exports.handler = function(event, context, callback)
{
var nonValidJson = "Not even Json";
var jsonParse = JSON.parse(nonValidJson);
访问未定义变量的属性:
exports.handler = function(event, context, callback)
{
var emptyObject = {};
var value = emptyObject.Item.Key;
访问RDS后未关闭mySql连接导致Lambda超时,然后它变得无响应。
制作重新上载代码的lambda可能需要一段时间。 经过一些测试后,它发现事实上Lambda试图重新启动(重装容器?),时间不够。如果将超时设置为10秒,则执行时间约为4秒后,Lambda开始工作,然后在下一次运行中表现正常。我也尝试过设置:
context.callbackWaitsForEmptyEventLoop = false;
并将所有'要求'处理程序内的块,没有真正有用。因此,防止Lambda死机的好方法是设置更大的超时,10s应该足以作为针对此bug的变通方法保护。