Node-REDのフローから自作ノードにバイナリデータを渡すとき、Uint8Arrayを使用していましたが、これはフロー上のUint8ArrayとNode.js側のUint8Arrayの型が違うために受け渡しできません。
バイナリデータでやり取りをするときは、Bufferクラスをサポートしましょう。そうすれば、フローとNode.jsでバイナリ配列のやり取りすることができます。
問題の事象
Node-REDのフローの中でUint8Array型のバイナリデータを生成して、自作ノードに渡そうとしましたが、正しく動作しませんでした。
ブラウザ上のfunctionノード内のコード
この結果を自作ノードに入力します。
let data = new Uint8Array([1,2,3,4,5]);
return {payload: data};
自作ノード内
node.on('input',(msg) => {
let payload = new Uint8Array([0,1,2,3,4,5]);
console.log(msg.payload);
console.log(payload);
});
結果
自作ノード内で、2つのpayloadを出力してみると、このようになります。
Functionノードで宣言したUint8ArrayはJSON、自作ノード内で宣言したUint8Arrayは配列になっており、明らかに違うようです...
正解
Bufferを使用した時の結果
ブラウザ上のfunctionノード内のコード
let buffer = new Buffer([0,1,2,3,4,5]);
let uint8array = new Uint8Array([0,1,2,3,4,5]);
return {buffer: buffer, uint8array: uint8array};
自作ノード内
node.on('input',(msg) => {
console.log({
buffer: (msg.buffer instanceof Buffer),
uint8array: (msg.uint8array instanceof Uint8Array)
});
console.log({binay: msg.binary});
console.log({uint8array: msg.uint8array});
});
正解の結果
このようにBuffer型を使用した方は成功しました。
Node.js内のUint8Arrayは使用できるようなので、instanceofで型をチェックすれば正しく判定できることもわかりました。