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

for loop in function node causes crash in Node-RED application on IBM Bluemix

我目前在 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 循环中,因为没有此部分,应用程序不会崩溃。

我想要做的是:我从网关获得一个带有传感器数据的消息对象。连接到此网关的是多个传感器,它们具有 ID 并正在向网关发送测量数据。为了区分和存储这些数据,我想注册每个传感器的 ID 并将其存储在节点的上下文中。在 for 循环中,我正在检查 ID 是否已被注册。

如果有人知道是什么导致了这次崩溃,我将非常感激。

P.S。我不知道这是否重要,但凭据、设置和流本身都存储在 cloudantDB 中。

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

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

当字段未定义时,或的左边为真。当迭代次数超过 256 时,右侧为真。这意味着您将访问 id_array[257] 及以后,并且将出现无法访问的内存异常,除非被捕获,否则会使您的应用程序崩溃。