コンテンツにスキップ

functionノード

functionノード

概要

functionノードは、JavaScriptを記述して、フロー内のデータを自由に加工・判定・生成するためのノードです。

ロボシュタインのフローでは、各ノードの間で msg というデータが受け渡されます。functionノードを使用すると、msg.payload や msg.topic などの値をJavaScriptで加工し、後続ノードへ渡すことができます。

例えば、受信したアラートメールの本文から必要な項目を抽出したり、複数の値を組み合わせて通知文を作成したり、条件に応じて出力先を分けたりする場合に使用します。

changeノードやswitchノードだけでは表現しづらい処理を行いたい場合に便利です。

functionノード設定画面

具体的な活用例(アラートメール本文から通知用データを作成する)

実務で特によくある「受信したアラートメールの内容を加工し、後続の通知ノードへ渡すフロー」を例に、functionノードの役割を見ていきましょう。

フローのイメージ図

functionノードのフローイメージ

① functionノードで必要な値を作成する

functionノードでは、JavaScriptを使って msg の値を加工できます。

例えば、メール本文からアラートレベルを判定し、後続ノードで使いやすいように msg.alertLevel を追加できます。

const text = msg.payload.text || "";

if (text.includes("CRITICAL")) {
    msg.alertLevel = "重要";
} else if (text.includes("WARNING")) {
    msg.alertLevel = "警告";
} else {
    msg.alertLevel = "通常";
}

return msg;

② 後続ノードへ渡す

functionノードで追加・加工した値は、後続のtemplateノードやswitchノード、メール送信ノードなどで利用できます。

例えば、templateノードでは以下のように通知文へ埋め込むことができます。

アラートレベル:{{alertLevel}}

このように、functionノードは、フロー内のデータをより柔軟に加工したい場合に使用します。

設定項目一覧

functionノードの編集画面は、「名前」の下にある「設定」「初期化処理」「コード」「終了処理」の4つのタブで構成されています。

必須 項目名 説明
名前 フローエディター上で表示されるノードの名前を任意で指定できます。
◯ コード(タブ) メッセージを受け取るたびに実行するJavaScriptを記述します。通常の処理はこのタブに記述します。
出力数(設定タブ) functionノードから出力する経路の数を指定します。
タイムアウト(設定タブ) コードの最大実行時間を秒単位で指定します。0の場合はタイムアウトしません。通常は必要な場合のみ設定します。
モジュール(設定タブ) 外部モジュールを利用する場合に設定します。
初期化処理(タブ) ノードの開始時(デプロイ時など)に一度だけ実行する処理を記述します。
終了処理(タブ) ノードの停止時(再デプロイ時など)に実行する処理を記述します。

通常の利用では、まずは「名前」と「コード」タブの設定だけで問題ありません。

functionノード設定タブ

基本的な書き方

functionノードでは、前のノードから受け取った msg を加工し、最後に return msg; で後続ノードへ渡します。

基本形

msg.payload = "処理が完了しました";
return msg;

return msg; を記述することで、加工後の msg が次のノードへ渡されます。

よく使う書き方

① msg.payload を書き換える

msg.payload = "サーバーアラートを検知しました";
return msg;

通知本文や後続ノードへ渡す主要なデータを作成する場合に使用します。

② 新しいプロパティを追加する

msg.alertLevel = "重要";
msg.systemName = "server01";
return msg;

後続のswitchノードやtemplateノードで参照しやすいように、任意のプロパティを追加できます。

③ 条件によって値を変える

const text = msg.payload.text || "";

if (text.includes("ERROR")) {
    msg.alertLevel = "重要";
} else {
    msg.alertLevel = "通常";
}

return msg;

メール本文やAPIレスポンスの内容に応じて、値を変更したい場合に使用します。

④ 後続へ渡さず処理を終了する

return null;

return null; を使用すると、後続ノードへデータを渡さずに処理を終了します。 例えば、条件に合わないアラートを後続へ流したくない場合に使用できます。

複数出力について

functionノードでは、「設定」タブの出力数を増やすことで、条件に応じて後続の接続先を分けることができます。

例えば、出力数を2に設定した場合、以下のように記述できます。

const text = msg.payload.text || "";

if (text.includes("CRITICAL")) {
    return [msg, null];
} else {
    return [null, msg];
}

この場合、CRITICAL を含む場合は1番目の出力へ、それ以外の場合は2番目の出力へデータを渡します。

出力のイメージ

戻り値 動作
[msg, null] 1番目の出力にだけ渡します。
[null, msg] 2番目の出力にだけ渡します。
[msg1, msg2] 1番目と2番目の両方に別々のデータを渡します。
return null; どの出力にも渡しません。

context/flow/globalについて

functionノードでは、値を一時的に保存したり、別の処理で参照したりするために、context、flow、global を使用できます。

種類 内容
context 同じfunctionノード内で値を保持します。
flow 同じフロー(タブ)内で値を共有します。
global 複数のフローで値を共有します。

flowに値を保存する例

flow.set("lastAlertTime", new Date().toISOString());
return msg;

flowから値を取得する例

msg.lastAlertTime = flow.get("lastAlertTime");
return msg;

ただし、ロボシュタインでは保存した値はメモリ上に保持されるため、インスタンスの再起動などで値が消える場合があります。再起動後も必ず値を保持したい場合は、別途データベースやファイル保存などの仕組みを検討してください。

利用例

例1:通知用の本文を作成する

例1:通知用の本文を作成する

const subject = msg.payload.subject || "";
const text = msg.payload.text || "";

msg.payload = `以下のアラートを検知しました。

件名:${subject}
本文:${text}`;

return msg;

メール送信ノードやチャット通知ノードへ渡す本文を作成する場合に使用します。

例2:メール本文から特定の値を抽出する

例2:メール本文から特定の値を抽出する

const text = msg.payload.text || "";
const serverMatch = text.match(/server[0-9]+/);

msg.serverName = serverMatch ? serverMatch[0] : "不明";

return msg;

監視アラート本文からサーバー名やIPアドレスなどを取り出したい場合に使用します。

例3:条件に合わないアラートを止める

例3:条件に合わないアラートを止める

const text = msg.payload.text || "";

if (!text.includes("ERROR")) {
    return null;
}

return msg;

特定の条件に合わないデータを後続へ流さない場合に使用します。

例4:処理結果に応じて出力先を分ける

出力数を2に設定した場合の例です。

例4:処理結果に応じて出力先を分ける

const text = msg.payload.text || "";

if (text.includes("CRITICAL")) {
    msg.alertLevel = "重要";
    return [msg, null];
} else {
    msg.alertLevel = "通常";
    return [null, msg];
}

重要アラートと通常アラートで通知先を分けたい場合などに使用できます。

注意点

return msg; を忘れない

functionノードで加工したデータを後続ノードへ渡すには、最後に return msg; を記述する必要があります。 return msg; がない場合、後続ノードへデータは渡されません。

JavaScriptのエラーに注意する

functionノードではJavaScriptを記述するため、文法ミスや変数名の誤りがあるとエラーになります。 例えば、存在しないプロパティを参照すると「TypeError: Cannot read properties of undefined」のようなエラーが発生し、後続ノードへはデータが渡されません。 エラーが発生した場合は、debugノードやcatchノードを使用して内容を確認してください。

参照するプロパティ名を確認する

msg.payload.text を参照するつもりが、実際には msg.payload に本文が入っている場合など、データの格納場所が異なると正しく処理できません。 必要に応じて、functionノードの前後にdebugノードを接続し、入力値や処理結果を確認してください。

複雑にしすぎない

functionノードは柔軟ですが、処理を詰め込みすぎると、後から内容を確認しづらくなります。 簡単な値の変更や置換であればchangeノード、条件分岐であればswitchノードを使用し、functionノードは複雑な加工が必要な場合に利用すると、フロー全体が分かりやすくなります。

タイムアウトに注意する

タイムアウトを設定している場合、その時間内にコードの実行が終わらないとエラーになります。 外部API連携や長時間の待機処理などは、functionノードだけで完結させず、http requestノードやdelayノードなどと組み合わせて構成してください。

関連ノード

  • debugノード:functionノードの前後でデータの中身を確認する場合に使用します。
  • changeノード:値の代入・置換・削除・移動など、簡単なデータ加工を行う場合に使用します。
  • switchノード:条件分岐を行う場合に使用します。
  • templateノード:通知文やメール本文を作成する場合に使用します。
  • http requestノード:外部APIと連携する場合に使用します。
  • catchノード:functionノード内で発生したエラーを検知する場合に使用します。

まとめ

functionノードは、JavaScriptを使ってフロー内のデータを柔軟に加工するためのノードです。

アラートメール本文から必要な値を抽出したり、通知用のデータを作成したり、条件に応じて出力先を分けたりする場合に活用できます。

一方で、処理を複雑にしすぎるとフローの内容が分かりにくくなるため、簡単な加工はchangeノード、条件分岐はswitchノードを使用し、functionノードは必要な場面に絞って利用すると運用しやすくなります。

フロー作成時は、必要に応じてdebugノードで入力値や処理結果を確認しながら、functionノードで必要な加工を行ってください。