2017-09-29 4 views
1

現在IBM Bluemix上でクラウドファウンドリアプリケーションとしてNode-REDを使用しています。だから、Google Chromeブラウザで動作しているNode-REDのフローエディタを使用しています。私の流れでは、私は関数ノードを持っていて、これが実行されるたびに、アプリケーションがクラッシュして再起動します。ここでfor loop in functionノードがIBM Bluemixの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; 

Iは、/ * * /の間のループのために問題がありました。

私がしたいのは、ゲートウェイからのセンサーデータを持つmsgオブジェクトを取得することです。このゲートウェイには、IDを持ち、測定データをゲートウェイに送信する複数のセンサーが接続されています。それらのデータを区別して保存するために、私はすべてのセンサーのIDを登録してノードのコンテキストに格納したいと思っています。 forループでは、IDが既に登録されているかどうかを確認しています。

このクラッシュを引き起こす原因が分かっている人は、非常に感謝しています。

P.S.これが重要かどうかはわかりませんが、資格、設定、およびフロー自体はcloudantDBに保存されています。フィールドが定義されていないときに、あなたの条件

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

またはの左側が真になるまで

ループのためのJavaScriptで
+0

コンテキストの代わりにグローバル/フローを見たいと思うかもしれません。それにかかわらず、ログ出力を含めると良いでしょう。 'bx cf logs 'を実行してログをテールし、クラッシュを再現し、そこに関連するものがあれば参照してください。あるいは、あなた自身をUIに服従させて、そこにログを見ることができます。 – amadain

+1

どのようなエラーが表示されますか? –

+0

私の腸は私にループ内のコンテキストを設定することは最適ではないと伝えます。通常、コンテキストから値を参照/コピーし、ローカルの変更を加えてから戻すことができます。 – grantwparks

答えて

0

条件は、本質的にしながらではありません。反復が256を超えた場合、右側が真となります。つまり、id_array [257]以降にアクセスすることになり、アプリケーションにクラッシュするまでアクセスできないメモリ例外が発生します。