メッセージを利用する

ノード間でメッセージを受け渡すことによってNode-REDのフローは機能します。 メッセージは、プロパティセットを持つことができる単純なJavaScriptオブジェクトです。

メッセージは通常payloadプロパティを持っています。 - これはほとんどのノードが利用するデフォルトのプロパティです。

Node-REDは_msgidと呼ばれるプロパティも追加します。- これはフローの進行状況を辿ることに利用できるメッセージの識別子です。

{
    "_msgid": "12345",
    "payload": "..."
}

プロパティの値には次のようなJavaScriptの型が有効です。:

  • Boolean - true, false
  • Number - 例 0, 123.4
  • String - "hello"
  • Array - [1,2,3,4]
  • Object - { "a": 1, "b": 2}
  • Null

JavaScriptの型に関する詳細情報

メッセージの構造を理解する

メッセージの構造を理解する最も簡単な方法は、 Debugノードにメッセージを渡し、デバッグサイドバーでそれを確認することです。

デフォルトでは、Debugノードはmsg.payloadプロパティを表示しますが、 任意のプロパティまたはメッセージ全体を表示するように設定することができます。

配列またはオブジェクトを表示するとき、 サイドバーはメッセージの探索がしやすい構造化されたビューを提供します。

  • 上部には渡されたプロパティ名が表示されます。 ここでは、デフォルトのmsg.payloadが利用されています。
  • プロパティ名の次はプロパティの型です。 - ObjectStringArrayなどです。
  • そして、プロパティの内容が表示されています。 配列とオブジェクトの場合、プロパティは1行にまとめられます。 クリックすることで、プロパティは展開されて詳細を表示します。


要素にマウスを重ねると、右側にボタンの一覧が現れます。

  • : 選択した要素へのパスをクリップボードにコピーします。 この例では、payload.Phone[2].typeをコピーします。 これによってChangeノードまたはFunctionノード内で、 プロパティへのアクセスする方法をすぐに特定することができます。

  • : 要素の値をJSON文字列としてクリップボードへコピーします。 サイドバーでは一定の長さを越えた配列およびバッファが切り捨てられていることに注意してください。 このようなプロパティの値をコピーすると、 切り捨てられた状態でコピーがおこなわれます。

  • : 選択された要素をピン留めし、いつでも参照できるようにします。 同じDebugノードから他のメッセージを受信したとき、 すべてのピン留めされた要素が自動的に展開されて表示されます。

JSONを利用する

JSON(JavaScript Object Notation)は JavaScriptオブジェクトを文字列で表現する標準的な手法です。 これはWeb APIでデータを返すために一般的に利用されています。

メッセージプロパティがJSON文字列を含む場合、 メッセージプロパティが持つプロパティにアクセスする前に、まず同値のJavaScriptオブジェクトにパースしなければなりません。 プロパティに文字列とオブジェクトのどちらが含まれるかを判定するには、 Debugノードを利用することができます。

Node-REDは、この変換をおこなうためにJSONノードを提供しています。

メッセージプロパティを変更する

フローの一般的なタスクは、メッセージをノード間で受け渡す際にメッセージのプロパティを変更することです。 例えば、HTTP Requestの結果は多くのプロパティをもつオブジェクトですが、 そのうちのいくつかだけが必要です。

メッセージの変更には主に2つのノード、 FunctionノードおよびChangeノードがあります。

Functionノードはメッセージに対して任意のJavaScriptコードを実行できるようにします。 このノードによって、メッセージの処理に関して完全な柔軟性が得られますが、 JavaScriptに精通している必要があり、多くの単純な処理の場合には不必要です。 Functionノードの書き方について、さらに多くの情報はこちらで確認できます。

ChangeノードはJavaScriptコードを書く必要なく、多くの機能を提供します。 メッセージプロパティを変更できるだけでなく、 フローコンテキストまたはグローバルコンテキストにアクセスすることも可能です。

このノードは4つの基本的な操作を提供します。:

  • プロパティへの値の代入
  • 検索と置換による文字列型のプロパティの値の置換
  • 値の削除
  • 値の移動

値の代入操作では、まず設定したいプロパティがどれなのかを決定し、そして保持させたい値を決定します。 この値は文字列や数値のようなハードコーディングされた値、 または他のメッセージまたはフロー/グローバルコンテキストのプロパティを利用することも可能です。 さらに、 新しい値を算出するためにJSONata式言語の利用もサポートされています。

例えば、Debugノードの機能を利用してメッセージプロパティのパスを特定し、 このパスを「対象の値(to)」フィールドに、リストから選択したmsg.のあとに続くようにそのまま貼り付けることができます。 これによって、msg.payload.Phone[2].typeの値がmsg.payloadに代入されます。


他の例としては、JSONata式を利用し、 msg.payload.temperatureに保持されている気温を華氏から摂氏に変換し、 その結果をmsg.payload.temperature_cという新しいメッセージプロパティに保管することができます。

{
    "payload": {
        "temperature": 90,
        "temperature_c": 32.22222
    }
}


JSONata式は非常にJavaScriptと似通っていますが、いくつか重要な違いがあることに注意してください。 詳細についてはjsonata.orgサイトを参照してください。

メッセージシーケンス

メッセージシーケンスは、何らかの方法で関連している順序付けられた一連のメッセージです。 例えば、 Splitノードはpayloadが配列となっている単一のメッセージを、 各メッセージが配列の要素の1つに対応したpayloadを持つようなメッセージシーケンスに変換します。

msg.partsを理解する

メッセージシーケンスの各メッセージはmsg.partsと呼ばれるプロパティを持っています。 これは、メッセージがどのようにシーケンスに収まっているかという情報を含むオブジェクトです。 次のようなプロパティがあります。:

msg.parts.id
シーケンスの一意な識別子
msg.parts.index
シーケンス内のメッセージの位置
msg.parts.count
わかっている場合、シーケンス内のメッセージの総数

Note: このparts配列にはシーケンスに関する追加のメタデータが含まれている可能性があります。 例えば、SplitノードではJoinノードによってシーケンスを再構成するために利用できる情報も追加します。 詳しくはSplitノードのドキュメントを参照してください。

シーケンスを利用する

Coreノードの多くでメッセージシーケンスを利用することができます。

Split

単一のメッセージをメッセージのシーケンスに変換します。

ノードの正確な挙動は、msg.payloadに含まれる型に依存します。:

String/Buffer
特定の文字(デフォルト: `\n`)、バッファシーケンスまたは固定長によって メッセージを切り分けます。
Array
メッセージを個々の配列要素または固定長の配列に切り分けます。
Object
メッセージはオブジェクトの各キー/バリューのペアとして送出されます。
Join

メッセージのシーケンスを単一のメッセージ変換します。

このノードは3種類の操作を提供します。:

自動
前のSplitノードの操作を元に戻そうとします。
手動
どのようにシーケンスを結合するか細かく操作できるようになります。
列の集約
0.18版で追加 - シーケンスの各メッセージに対してJSONata式を実行し、 単一のメッセージを生成するように集約された結果を得ることができます。
Sort

0.18版で追加

プロパティの値またはJSONata式の結果に基づいてシーケンスを並べ替えます。

Batch

0.18版で追加

受信したメッセージから新しいメッセージシーケンスを作成します。

このノードは3種類の操作を提供します。:

メッセージ数でグループ化
指定した長さのシーケンスにメッセージをグループ化します。 オーバーラップオプションは、シーケンスの終わりのメッセージが 次のシーケンスの始めにいくつ繰り返されるかを指定します。
時間間隔でグループ化
指定した時間間隔内に届いたメッセージをグループ化します。 時間間隔以内にメッセージが1つも到着しなかった場合、 ノードはオプションで空のメッセージを送出することができます。
列の結合
入力シーケンスを連結してメッセージシーケンスを生成します。 各シーケンスには、識別するためのmsg.topicプロパティが必要です。 このノードは連結されている順序付けシーケンスを特定するため、 topicの値のリストが設定されています。