- はじめに
- 開発
- デプロイして実行する
- 例
- 参照
変数とデータ フロー
ノードの出力と変数を介したノード間のデータの流れと、サブフローと分岐のスコープ ルール
ワークフロー内のノードはデータを自動的に共有しません。ノードが HTTP 応答や計算値などの出力を生成すると、その後のノード (下流のノードと呼ばれる) は、式を使用してその出力を読み取ります。式は、値を読み取ったり計算したりする JavaScript の短い部分です。データ フローとは、ワークフローがノード間で値を渡し、実行中はその値を保持する方法です。
データは次の 2 つの方法でワークフロー内を移動します。
- ノード出力: 各ノードは、下流のノードが参照できる出力を生成します。
- 変数: ノード間で値を格納および渡すために定義するワークフロー レベルの値です。
式の構文 では、完全な文法、演算子、および $vars 参照の記述方法について説明します。
動作のしくみ
ノードの出力
データを生成するすべてのノードは、 $vars.<nodeName>.outputを通じてそのデータを利用できるようにします。ノード名は、ノードの種類から自動的に割り当てられます。たとえば、最初の HTTP 要求ノードの名前は httpRequest1、2 番目の HTTP 要求ノードの名前は httpRequest2です。
ノードの変数名はノードの ID であり、ノードを選択すると [プロパティ] パネルの [ 詳細 設定] タブに表示されます。[ID] の横にある鉛筆アイコンによってID が変更されます。
// Access HTTP Request response
$vars.httpRequest1.output.body
$vars.httpRequest1.output.code
// Access Script return value
$vars.script1.output
// Access a second HTTP Request
$vars.httpRequest2.output.body
// Access HTTP Request response
$vars.httpRequest1.output.body
$vars.httpRequest1.output.code
// Access Script return value
$vars.script1.output
// Access a second HTTP Request
$vars.httpRequest2.output.body
出力構造はノードの種類によって異なります。ノード参照の各ページには、そのノードの出力が一覧表示されます。
ノード エラー
ノードに障害が発生し、そのエラー ハンドルが接続されている場合、障害の詳細はノードの出力の横に $vars.<nodeName>.errorに表示されます。エラー パス上のノード (たとえば、失敗をログに記録するスクリプト ノード) で読み取ってください。
// Read the error of a failed HTTP Request
$vars.httpRequest1.error.message // what went wrong
$vars.httpRequest1.error.status // the HTTP status, for example 404
// Read the error of a failed HTTP Request
$vars.httpRequest1.error.message // what went wrong
$vars.httpRequest1.error.status // the HTTP status, for example 404
エラー オブジェクトは、エラー パス上にのみ存在します。成功パスでは、 $vars.<nodeName>.error は未定義です。エラー オブジェクトには 、そのすべてのフィールドが一覧表示されます。
変数
変数は、1 回の実行中保持されるワークフロー レベルの値です。これらは [変数] パネルで定義します。パネルは、右側の [プロパティ] タブの横にある [変数] タブから開きます。このパネルには、ワークフローの 入力、 出力、 変数 、および各ノードの出力が一覧表示されます。トグルによって、[ すべての変数] と [選択済み] ノードが切り替わります。ノードの行にある [ノードにフォーカス] アイコンを使用すると、キャンバスがそのノードにズームされます。[選択したノード] がオンの場合、パネルは選択したノードに限定され、そのヘッダーにそのスコープの名前が表示されます (例: スコープ: 手動トリガー)。
パネル内の [変数] の横にある [+] をクリックすると、[変数を追加] ダイアログが開きます。各変数は以下で構成されます。
- 名前: 式でどのように参照するかを示します (例:
$vars.orderTotal)。 - データ型: String、Number、Boolean、Object、または Array。
- 説明: 値が表す内容に関する任意のメモ。
- 既定値: 任意の開始値。
ワークフロー レベルの変数は常に双方向であり、どのノードでも読み書きできます。構成する方向の設定はありません。読み取り専用または書き込み専用の値は、代わりにトリガーの入力または出力変数から取得されます。以下で説明します。
3 種類のデータは、定義する場所によって異なります。
| 種類 | 定義 | 方向 | 参照構文 |
|---|---|---|---|
| 変数 | [変数] パネルの [変数] の横 | 双方向 (読み取りおよび書き込み) | $vars.<name> |
| トリガーの入力 | トリガー ノード、またはトリガーの横にある [ 変数 ] パネル | 読み取り専用 | $vars.<triggerName>.output.<name> |
| 出力変数 | [終了] ノード、または [出力] の横にある [変数] パネル | 書き込み専用 | $vars.<name> |
それぞれをどのような場合に使用するか:
- ノードの出力は、あるノードから次のノードに渡されるデータを適合させます。これは最も一般的なパターンです。
- 変数は、ワークフロー全体でアクセスできる必要がある値に適合します。
- 入力と出力は、ワークフロー自体が受け取る内容または返す内容を定義する値に適合します。以下の「トリガーの入力」と「出力変数」で説明しています。
customerEmail、invoiceTotal、apiResponseなどのわかりやすいキャメルケース名は、実行トレースで経時的に判読可能なままです。単一文字の名前や略語はすぐに意味を失います。
トリガーの入力
入力変数は [変数] セクションで定義 されていません 。これらは、トリガーの [プロパティ] パネルに入力引数として追加されるか、[変数] パネルでトリガーの横に + キーとともに追加され、[入力変数を追加] ダイアログが開きます。どちらの方法でも、それらは読み取り専用になります。トリガーが起動すると、その入力は として使用できます$vars.<triggerName>.output.<inputName>
// Access an input defined on a Manual Trigger named "manualTrigger1"
$vars.manualTrigger1.output.userId
// Access an input defined on a Manual Trigger named "manualTrigger1"
$vars.manualTrigger1.output.userId
これは、すべての種類のトリガーに適用されます。ワークフローに複数のトリガーがある場合、各トリガーは専用の入力を所有し、下流のノードは実行を開始した特定のトリガーを参照します。
出力変数
出力変数はワークフローの結果を表します。これらのパラメーターは、終了ノードの [パラメーター] タブの [出力変数を追加] とともに追加されるか、[変数] パネルの [出力] の横に [+] が付けられます。これらは書き込み専用です。
// Access an output variable named "finalStatus"
$vars.finalStatus
// Access an output variable named "finalStatus"
$vars.finalStatus
各出力変数は以下で構成されます。
- 名前: 式でどのように参照するかを示します (例:
$vars.finalStatus)。 - データ型: String、Number、Boolean、Object、または Array。
- 説明: 値が表す内容に関する任意のメモ。
- 既定値: 変数が設定されない場合に使用される任意のフォールバックです。
出力変数の値は、他の変数と同じように、ノードの Update Variable セクションから、またはスクリプト ノードの戻り値として設定されます。
変数の定義
変数定義は [ 変数] パネルに存在します。各定義には変数の名前と型が格納されるため、実行中にその値を一貫して参照できます。
変数の更新
変数は、ノードの構成またはスクリプト ノードの出力によって更新できます。
任意のノードから
すべてのノードの [プロパティ] パネルの [詳細設定] タブに [変数を更新] セクションがあり、ここに [変数を追加] をクリックすると割り当てが追加されます。セクションには、書き込み可能な変数のターゲット (ワークフロー変数または出力変数) と、それに割り当てられた JavaScript 式が格納されます。式はノードの完了後に評価されます。
スクリプト ノードから
スクリプト ノードの戻り値は、下流で $vars.<scriptName>.outputとしてアクセスできます。スクリプト ノードには、変数を直接書き込み用に、他のノードと同じ [変数を更新] セクションもあります。
// The return value becomes $vars.script1.output
return {
orderTotal: $vars.httpRequest1.output.body.price * $vars.httpRequest1.output.body.quantity
};
// The return value becomes $vars.script1.output
return {
orderTotal: $vars.httpRequest1.output.body.price * $vars.httpRequest1.output.body.quantity
};
スコープ ルール
ノードは、以下からの出力にアクセスできます。
- 同じスコープ内の上流ノード: それ以前に実行されたのと同じレベルのノード。
- 親コンテナ ノード: ノードがサブフローまたはループ内にある場合、親のスコープにアクセスできます。
スコープとは、ワークフロー内で名前を読み取ることができる部分を意味します。ノードは、以下からの出力にアクセスできません。
- 別のブランチ内のノード: Decision または Switch によって実行が別のパスに送信された場合、それらのノードの出力は使用できません。
- 実行されていないノード: 出力はノードの実行後にのみ存在します。
サブフローのスコープ設定
サブフローは、独自の変数スコープを作成します。サブフロー内のノードは、以下にアクセスできます。
- 同じサブフロー内の他のノード
- 親ワークフローのスコープ
サブフロー内で更新される変数には名前空間 (つまり、サブフロー名のプレフィックス) が設定され、親ワークフローとの競合を回避します。たとえば、subflow1 という名前のサブフロー内にcounterされた変数は、サブフローの外部から$vars.subflow1.counterとして参照されます。
サブフローの戻り値は、親ワークフローから $vars.<subflowName>.outputとしてアクセスできます。
並列ブランチ
並列分岐ごとに専用の変数があります。あるブランチ内で変数を変更しても、その変更は別のブランチで表示されません。マージ ノードは、パスを再結合する必要がある場合に、並列パスからの出力を統合します。
パターン
動的文字列を構築する
スクリプト ノード内のテンプレート リテラルは、変数と静的テキストを組み合わせます。
return `Hello ${$vars.firstName}, your order #${$vars.orderId} has shipped.`;
return `Hello ${$vars.firstName}, your order #${$vars.orderId} has shipped.`;
ループ内で値を蓄積する
アキュムレータパターンは、ループノードの前に初期化され、ループ本体内に追加された配列を使用します。
// Script node inside the Loop body
results.push(item.processedValue);
return results;
// Script node inside the Loop body
results.push(item.processedValue);
return results;
シークレット値をログに表示しないようにする
シークレット変数の値は UI 上ではマスクされますが、エクスポートされたトレース データに表示される場合があります。ログに記録すると、データ漏洩のリスクが伴います。
実際の例
API からユーザーを取得し、ユーザーのロールに基づいてルーティングするワークフローには、次の 3 つのノードがあります。
- HTTP 要求 (
httpRequest1):https://api.example.com/users/42に GET 要求を送信します。 - スクリプト (
script1): 次のコードでユーザーのロールを抽出します。
const user = $vars.httpRequest1.output.body;
return {
name: user.name,
role: user.role,
isAdmin: user.role === "admin"
};
const user = $vars.httpRequest1.output.body;
return {
name: user.name,
role: user.role,
isAdmin: user.role === "admin"
};
- 判断 (
decision1): 管理者ステータスの分岐。次の式で指定します。
$vars.script1.output.isAdmin === true
$vars.script1.output.isAdmin === true
True 分岐は管理者アクセス権を付与し、False 分岐は標準アクセス権を付与します。