函数节点中的for循环导致IBM Bluemix上的Node-RED应用程序崩溃

时间:2017-09-29 08:34:43

标签: node.js ibm-cloud cloudant node-red

我目前在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中。

1 个答案:

答案 0 :(得分:0)

在javascript for循环中,条件基本上是一段时间而不是直到你的条件

(id_array[i] === undefined) || (i > 256)

当字段未定义时,或者左侧为true。当迭代超过256时,右侧是正确的。这意味着您将访问id_array [257]及更高版本,并且将获得一个无法访问的内存异常,除非被捕获,否则会导致应用程序崩溃。