2017-09-29 3 views
1

J'utilise actuellement Node-RED comme application cloud-foundry sur IBM Bluemix. J'utilise donc l'éditeur de flux de Node-RED qui fonctionne sur un navigateur Google Chrome. Dans mon flux, j'ai un nœud de fonction et à chaque fois que celui-ci est exécuté, l'application se bloque et je dois le redémarrer.pour nœud de fonction de boucle provoque un blocage dans l'application Node-RED sur IBM Bluemix

Voici le code de la fonction nœud:

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; 

J'ai localisé le problème dans la boucle entre le/* * /, parce que sans cette section, l'application ne tombe pas en panne.

Ce que je veux faire est: Je reçois un objet msg avec des données de capteur d'une passerelle. Plusieurs capteurs, connectés à cette passerelle, ont un identifiant et envoient des données de mesure à la passerelle. Pour distinguer et stocker ces données, je veux enregistrer l'identifiant de chaque capteur et le stocker dans le contexte du noeud. Dans la boucle for, je vérifie si l'identifiant a déjà été enregistré.

Si quelqu'un sait ce qui pourrait causer ce crash, je serais très reconnaissant.

P.S. Je ne sais pas si c'est important, mais les informations d'identification, les paramètres et le flux lui-même sont stockés dans un cloudantDB.

+0

Vous pouvez regarder global/flow au lieu du contexte. Peu importe, il serait bon d'inclure votre sortie de journal. Exécutez 'bx cf logs ' pour terminer les journaux, reproduire le crash, voir si quelque chose de pertinent là-dedans. Ou vous pouvez vous soumettre à l'interface utilisateur et regarder dans le journal là-bas. – amadain

+1

Quelle erreur obtenez-vous? –

+0

Mon instinct me dit de mettre le contexte à l'intérieur d'une boucle ne va pas être optimal. Il est généralement possible de référencer/copier la valeur à partir du contexte, de faire des changements locaux et ensuite de le remettre. – grantwparks

Répondre

0

Dans un javascript pour la boucle la condition est essentiellement un moment et pas avant d'avoir été à votre condition

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

Le côté gauche du ou est vrai lorsque le champ est défini. Le côté droit est vrai lorsque l'itération a dépassé 256. Cela signifie que vous accéderez à id_array [257] et au-delà, et obtiendrez une exception de mémoire inaccessible qui, à moins d'être interceptée, provoquera le crash de votre application.