Raspberry Pi上で起動させたNode-REDと、クラウドのwebsocketサーバーとの通信でハマった出来事およびその解決方法を備忘録も兼ねてこちらに記します。
こちらについてはネットを調べても解決方法があまり多くは出てこなかったので、同じようなことで悩まれた方がいたら見ていただけますと幸いです。
※2/25追記
この件の原因については、websocket outノードのヘルプに理由が書かれておりました。。
灯台元ぐらし。。
やりたかったこと
クラウドにあるwebsocketサーバーからのリクエストを、クライアントとなるRaspberry Pi上のNode-REDで受信し、その内容の一部と付加したいデータを組み合わせたデータを生成、レスポンスとしてサーバーに返したい。
問題
websocket inノードからの値は問題なくfunctionノードに渡っているものの、なぜかwebsocket outノードまで流れていきませんでした。
しかし、functionノードにInjectノードを接続しフローを作って実行させてみると、問題なくwebsocket outノードが機能している。。この違いは何。。。
原因と解決方法
websocket inおよびInjectノードからのフローにおいて、functionノードから出力されるペイロードのデータに違いはありませんでした。
結論として問題はmsgオブジェクト自体にありました。
functionノードにDebugノードを繋ぎ、ログ出力対象をmsgオブジェクト全体にしてwebsocket inからのフローでログを確認すると、"_session"というパラメーターが"payload"と"_msgid"以外に付与されていることに気がつきました。
(中身の"type"プロパティより、websocketノード関連のプロパティであることは明白ですね)
■Debugノード出力結果(websocket inからのフロー)
もしやと思い、この"_session"パラメーターをchangeノードで削除してみました。
その結果、問題なくサーバー側へデータを送信することができました。
この"_session"パラメータの存在についてですが、
・ループ防止の観点でセッション情報がmsgオブジェクトに付与されている?
・そもそも目的としていた動作をwebsocket in/outノードで行うこと自体が主流ではない?
等考えられますが、ひとまず目的の動作ができているので、今は良しといたします。。。
(2/25追記)
アドバイスいただきwebsocket outノードのヘルプを確認したところ本件について記載が載っておりました。
「WebSocket Inノードが生成したメッセージをブロードキャストしたい場合には、フロー中でmsg._sessionプロパティを削除します。」
。。。バッチリ書いてある。