我目前在IBM Bluemix上使用Node-RED作为云代工厂应用程序。因此,我使用的是运行在Google Chrome浏览器上的Node-RED流编辑器。在我的流程中,我是一个功能节点,每次执行此功能时,应用程序崩溃,我就重新启动它。
这是函数节点的代码:
var id_array = context.get('id_array')||[];
var id_index = context.get('id_index')||0;
var first_time_execution = context.get('first_time_execution')||true;
var i;
var sensor_id = msg.payload.sensor_data.sensor_id;
if(first_time_execution){
id_array[0] = undefined;
first_time_execution = false;
context.set('first_time_execution', first_time_execution);
}
/*for(i = 0; (id_array[i] === undefined) || (i > 256); i++){
if(sensor_id == id_array[i]){
msg.payload.array_index = i;
context.set('id_array', id_array);
context.set('id_index', id_index);
return msg;
}
}*/
id_array[id_index] = sensor_id;
msg.payload.array_index = id_index;
if(id_index > 256){
id_index = 0;
}else{
id_index++;
}
context.set('id_array', id_array);
context.set('id_index', id_index);
return msg;
我已将问题放在/ * * /之间的for循环中,因为没有此部分,应用程序不会崩溃。
我想要做的是:我从网关获取带有传感器数据的msg对象。连接到该网关的是几个传感器,它们具有ID并将测量数据发送到网关。为了区分和存储这些数据,我想注册每个传感器的ID并将其存储在节点的conxtext中。在for循环中,我要检查ID是否已经注册。
如果有人知道什么可能导致这次崩溃,我会非常感激。
P.S。我不知道这是否重要,但凭据,设置和流本身都存储在cloudantDB中。
答案 0 :(得分:0)
在javascript for循环中,条件基本上是一段时间而不是直到你的条件
(id_array[i] === undefined) || (i > 256)
当字段未定义时,或者左侧为true。当迭代超过256时,右侧是正确的。这意味着您将访问id_array [257]及更高版本,并且将获得一个无法访问的内存异常,除非被捕获,否则会导致应用程序崩溃。