n8n-expression-syntax について
n8n ワークフローの式を書くためのガイドです。動的な項目、ノードデータの参照、組み込みヘルパーに加え、式とネイティブノードの使い分けも説明します。
主な機能
- 01二重波括弧による動的な式の記述
- 02現在および他ノードのデータ参照
- 03JMESPath によるネストした JSON の検索
- 04配列、文字列、日付の組み込みヘルパー活用
- 05タスクに応じたネイティブノード、式、コードの選択
活用シーン
- 01上流ノードのデータを項目に挿入
- 02ネストした JSON の絞り込みと値の生成
- 03日付の書式設定や配列データの処理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ czlonkowski/ n8n-skills --skill n8n-expression-syntaxインストール後、Claude Code で/n8n-expression-syntaxを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
COMMON_MISTAKES.mdEXAMPLES.mdREADME.md詳細
n8n の式構文
ワークフローで正しい n8n の式を書くためのエキスパートガイドです。
式の形式
n8n の動的コンテンツはすべて二重波括弧を使用します。
{{expression}}
例:
✅ {{$json.email}}
✅ {{$json.body.name}}
✅ {{$node["HTTP Request"].json.data}}
❌ $json.email (no braces - treated as literal text)
❌ {$json.email} (single braces - invalid)
コア変数
$json - 現在のノードの出力
現在のノードのデータにアクセスします。
{{$json.fieldName}}
{{$json['field with spaces']}}
{{$json.nested.property}}
{{$json.items[0].name}}
$node - 他のノードを参照
前の任意のノードのデータにアクセスします。
{{$node["Node Name"].json.fieldName}}
{{$node["HTTP Request"].json.data}}
{{$node["Webhook"].json.body.email}}
重要:
- ノード名は必ず引用符で囲む必要があります
- ノード名では大文字と小文字が区別されます
- ワークフロー内のノード名と完全に一致する必要があります
$now - 現在のタイムスタンプ
現在の日付と時刻にアクセスします。
{{$now}}
{{$now.toFormat('yyyy-MM-dd')}}
{{$now.toFormat('HH:mm:ss')}}
{{$now.plus({days: 7})}}
$env - 環境変数
環境変数にアクセスします。
{{$env.API_KEY}}
{{$env.DATABASE_URL}}
警告:一部の n8n インスタンスでは N8N_BLOCK_ENV_ACCESS_IN_NODE が有効になっており、$env へのアクセスが完全にブロックされます。$env がエラーを返す場合は、次の方法を代わりに使用してください。
- 値を認証情報に保存する
- 手動で値を入力した Set ノードを使用する
- Webhook のクエリパラメーターを通じて値を渡す
🚨 重要:Webhook データ構造
最もよくある間違い:Webhook データはルートにありません!
Webhook ノードの出力構造
{
"headers": {...},
"params": {...},
"query": {...},
"body": { // ⚠️ USER DATA IS HERE!
"name": "John",
"email": "[email protected]",
"message": "Hello"
}
}
Webhook データへの正しいアクセス方法
❌ WRONG: {{$json.name}}
❌ WRONG: {{$json.email}}
✅ CORRECT: {{$json.body.name}}
✅ CORRECT: {{$json.body.email}}
✅ CORRECT: {{$json.body.message}}
理由:Webhook ノードは、ヘッダー、パラメーター、クエリパラメーターを保持するために、受信データを .body プロパティの下に格納します。
よくあるパターン
ネストされたフィールドへのアクセス
// Simple nesting
{{$json.user.email}}
// Array access
{{$json.data[0].name}}
{{$json.items[0].id}}
// Bracket notation for spaces
{{$json['field name']}}
{{$json['user data']['first name']}}
他のノードの参照
// Node without spaces
{{$node["Set"].json.value}}
// Node with spaces (common!)
{{$node["HTTP Request"].json.data}}
{{$node["Respond to Webhook"].json.message}}
// Webhook node
{{$node["Webhook"].json.body.email}}
変数の結合
// Concatenation (automatic)
Hello {{$json.body.name}}!
// In URLs
https://api.example.com/users/{{$json.body.user_id}}
// In object properties
{
"name": "={{$json.body.name}}",
"email": "={{$json.body.email}}"
}
式を使わない場合
❌ Code ノード
Code ノードでは、式ではなくJavaScript に直接アクセスします。
// ❌ WRONG in Code node
const email = '={{$json.email}}';
const name = '{{$json.body.name}}';
// ✅ CORRECT in Code node
const email = $json.email;
const name = $json.body.name;
// Or using Code node API
const email = $input.item.json.email;
const allItems = $input.all();
❌ Webhook パス
// ❌ WRONG
path: "{{$json.user_id}}/webhook"
// ✅ CORRECT
path: "user-webhook" // Static paths only
❌ 認証情報フィールド
// ❌ WRONG
apiKey: "={{$env.API_KEY}}"
// ✅ CORRECT
Use n8n credential system, not expressions
変換のゲートキーパー
データを変換するためにノードを追加する前、またはコードを書く前に、次の順序で確認し、最初に当てはまるものを選んでください。
- サービス独自のノードが、独自のフィールドで処理します。CRM ノードのフィールドスロット、Slack ノードの Blocks フィールド、Data Table の挿入時の列ごとのスロットなどです。その操作を扱うノードがない場合に限り、HTTP Request を使用します。
- その処理に適したネイティブノードを使います。Filter、IF / Switch、Summarize、Aggregate、Split Out、Merge、Compare Datasets、Remove Duplicates、Sort + Limit、Date & Time、XML / HTML / Extract From File、HTTP Request のページネーション、Crypto などです。
using-n8n-mcp-skillsの処理とノードの対応表でノードを確認できます。各ノードの設定はn8n-node-configuration→ NATIVE_NODES.md にあります。 - 短い式(
{{ ... }})を、そのノードのフィールド内で使います。プロパティへのアクセス、メソッドチェーン(.map().filter().join())、三項演算子、文字列の組み立て、Luxon による日付計算、以下のヘルパー関数などを使い、中間変数を作らずに「A を受け取り、B を生成する」式を記述します。- ネストされた JSON から 1 つのフィールドをクエリする(配列内の要素を選択、フィルタリング、合計するなど)場合は、同じ式の中で
$jmespath()を使います(以下のルールを参照)。後続の処理で要素ごとに 1 アイテムが必要な場合は、代わりに Split Out / Filter / Aggregate を使用します。
- ネストされた JSON から 1 つのフィールドをクエリする(配列内の要素を選択、フィルタリング、合計するなど)場合は、同じ式の中で
- Code ノードは、限定された次の場合にのみ使用します。ノードでは表現できないループや再帰、実行をまたいだ状態、どのノードでも処理できない解析、許可リストにあるライブラリ、数千アイテムに対する大量処理(明記または測定されている場合)、または 4 つ以上の接続用ノードを置き換える短い Code ノード(約 15 行)です。「Why Code:」の注記を付けてください。
n8n-code-javascriptを参照してください。
関数本体はコードです。 ロジックに const、if、return、または複数のステートメントが必要な場合、つまり {{ }} の中に (() => { ... })() を記述する場合は、式の範囲を超えています。ネイティブノードと短い式に分割するか、「Why Code:」の注記を付けて Code ノードに移してください。長い式はどちらよりも読みづらく、実行時エラーが発生すると null に変換されて気づかれません(デバッグを参照)。作成/更新フックは、Code 以外のノードにある関数本体を検出します。
順序が重要な理由。 読みやすさのためです。ネイティブノードならキャンバス上で何をするのかが分かり、短い式なら、誰かが開かなければ確認できない上流ノードに隠すのではなく、使用するフィールド内に表示されます。パフォーマンスが判断を左右することはほとんどありません。数百アイテム未満では、どのコストも問題にならず、測定済みのモデルは n8n-code-javascript に記載されています。
$jmespath() — 1つの式でネストされた JSON をクエリする
{{ $jmespath($json, "customers[?country=='PL' && revenue > `100000`].name") }} → ["Acme"]
n8n 2.38 で検証済みです。この1つの式で、Split Out → Filter → Aggregate が返すものとまったく同じ結果を、ノードを追加せずに取得できます。構文は厳格で、ほとんどの間違いはエラーにならず、気づかないまま失敗します。
| 書き方 | ではなく | 誤った形式で起きること |
|---|---|---|
$jmespath(object, "query")、オブジェクトを先に指定 | $jmespath("query", object) | expected two arguments (Object, string) for this function がスローされます(JMESPath の公式ドキュメントでは search(query, data) と記載されています) |
文字列にはシングルクォートを使用:country=='PL' | country=="PL" | ダブルクォートはフィールド名を意味します → エラーは出ず [] が返されます |
数値/ブール値はバッククォートで囲む:revenue > `100000` | revenue > 100000 | 構文エラー → 式全体が null になります(「デバッグ」を参照) |
&& || ! == | and or = | 構文エラー → null |
ハイフンを含むキーはクォートする:'customers[*].contact."first-name"'(JS 文字列をシングルクォートで囲む) | contact.first-name | 構文エラー → null |
複数のアイテムを扱う場合は、ラッパーを維持する:$jmespath($('Node').all(), "[?json.country=='PL'].json.name") または $jmespath($input.all().map(i => i.json), "[?country=='PL'].name") | .all() に対する "[?country=='PL'].name" | アイテムは {json: …} ラッパーで囲まれています → [] |
- 結果: パスまたはインデックスが存在しない場合 →
null、フィルターに一致するものがない場合 →[]、空の射影に対するsum()→0。 - 最初の引数はオブジェクトまたは配列である必要があります。 文字列(テキストレスポンスを返す HTTP Request など)や
undefined($json.missingField)を指定すると、同じexpected two argumentsエラーがスローされます。この場合、ノードは失敗します。 - 便利な機能:
length()、sum()、max_by(arr, &field)、sort_by(arr, &field)、reverse()、contains()、starts_with()、keys()、to_number();射影[*]、フラット化[]、パイプ| [0]、再構成{name: name, email: contact.email}。 - 返されるのは値であり、アイテムではありません。 結果を1つのフィールド(メッセージ本文、HTTP ボディ、IF/Filter 条件)に渡す場合に使用してください。後続の処理で一致ごとに1つのアイテムが必要な場合は、Edit Fields で
$jmespathを使って絞り込み、そのフィールドに対して Split Out を1つ実行します。 - 使用できる場所: 式と JavaScript Code ノード(引数の順序は同じ)です。ネイティブの Python Code ノードでは使用できません。
組み込みヘルパー関数
n8n は {{ }} 内の値にメソッドを追加します。ネイティブノードと組み合わせることで、1 行だけの Code ノードの大半を置き換えられます。これらは式でのみ使用でき、Code ノードでは使用できません。Code 内では通常の JavaScript を使用してください(format() の代わりに toFormat() を使用します)。
これらが参照できるのは現在のアイテムの値のみです。アイテム間にまたがる処理(アイテムの重複排除、グループ化と合計、2 つのリストの結合)はノードで行います。n8n-mcp 2.97.0 以降では、tools_documentation({topic: "expression_helpers", depth: "full"}) に、各ヘルパーのテスト済みの例が記載されています。
| 必要な処理 | 式 | 備考 |
|---|---|---|
| 各オブジェクトから 1 つのフィールドを取得 | {{ $json.items.pluck('name') }} | 複数の名前 → オブジェクトごとに 1 つの配列 |
| 合計/平均/最小/最大 | {{ $json.prices.sum() }} | 数値以外が含まれるとエラーになります。数値文字列も含まれます |
| 配列の重複を排除 | {{ $json.rows.unique('email') }} | 引数はそれぞれ 1 つのフィールド名です。引数なしの場合は値全体を比較します(removeDuplicates は別名です) |
| 空の値に対するデフォルト値 | {{ $ifEmpty($json.name, 'there') }} | 空と見なされる値は undefined、null、''、[]、{} です。引数は正確に 2 つ必要です |
| テキスト内のメールアドレスまたはドメイン | {{ $json.text.extractEmail() }}, .extractDomain() | 一致するものがない場合は undefined |
| 文字列のハッシュ化 | {{ $json.email.hash('sha256') }} | デフォルトは md5 です。HMAC には Crypto ノードが必要です |
| 日付間の日数 | {{ $now.diffTo($json.created_at, 'days') }} | 受信側から引数を引きます。引数の日付がより過去なら正の値になります |
| 文字列を日付に変換 | {{ $json.created_at.toDateTime().format('yyyy-MM-dd') }} | その後、.diffTo()、.plus(7, 'days')、.extract('month') を使用できます |
| 配列をバッチに分割 | {{ $json.ids.chunk(100) }} | 一括 API リクエストのボディ用 |
| 空の値を除去 | {{ $json.tags.compact() }}, {{ $json.compact() }} | 配列とオブジェクト |
diffToは DateTime、JS Date、または ISO 文字列と、省略可能な単位(デフォルトはdays)または単位のリスト(その場合はオブジェクトを返します)を受け取ります。$json.created_at.toDateTime().diffToNow('days')は、過去の日付に対して負の値になります。- 文字列に対する
.sum()はエラーになります。{{ $json.items.pluck('price').map(Number).sum() }}のようにします。 nullまたはundefinedに対してヘルパーを呼び出すとエラーになります。?.({{ $json.email?.extractDomain() }})または$ifEmpty()で保護してください。- エラーをスローするヘルパー(不正な単位、誤った引数の数、値の欠落)はノードを失敗させます。
{{ }}内の通常の JavaScript エラーは、何も通知せずにnullを返します。どちらの場合も、実際のアイテムでテストしてください。
Set ノードのアンチパターンと分岐の合流
次のノード用にフィールドを再マッピングするだけの Set ノードを削除する
次のノードが読み取れるようにフィールドをコピーまたは名前変更するだけの Set/Edit Fields ノードは、余分なものです。代わりに、使用側で式を直接インライン化してください。
❌ Webhook → Set { customer_id: {{ $json.body.customer_id }} } → Postgres: WHERE id = {{ $json.customer_id }}
✅ Webhook → Postgres: WHERE id = {{ $('Webhook').item.json.body.customer_id }}
Set ノードは処理を一段増やし、キャンバスを散らかし、リファクタリング時のリスクを高めますが、使用側が自分でできることしかしていません。n8n_update_partial_workflow を使って安全に削除するには、接続をつなぎ替え(Set の入力元と出力先の接続を removeConnection で削除し、入力元から使用側へ直接 addConnection で接続)、使用側の式を patchNodeField で修正して元の入力元をノード名で参照し、その後 Set を removeNode で削除します。
簡単な確認方法: Set は、次のノードが直接読み取れるフィールド($('Source').item.json.x)を再マッピングするだけですか?
- はい → 削除し、使用側で式をインライン化します。
- いいえ、何かを作成している → 名前付きのステップとして残します(生成する内容が分かる名前を付けます)。
Edit Fields を使う価値があるケース:
- 定数のアイテムを作成する場合 — 固定設定、デフォルトのペイロード、テスト用フィクスチャなど。
- エラーまたは戻り値のアイテムを作成する場合 — Respond の前に
{ error: 'validation_error', message: … }を作成する場合や、サブワークフローの出力を作成する場合。 - 複数のノード、またはリクエストボディ全体の基になるペイロードオブジェクトを作成する場合。
- 2 つ以上の使用側が同じ派生値を読み取り、導出処理が複雑な場合(名前を付けることで読みやすくなり、計算も一度で済みます)。
- サブワークフローの最後の Return ノードで、出力の契約を整える場合。 この場合、「単一の使用側」とはすべての呼び出し元のことなので、Set が API 境界になります。また、
Include Other Fields: falseにすると出力の形をホワイトリスト化でき、内部作業用のフィールドが漏れません。 - フィールドの名前変更やホワイトリスト化を行い、それを使用側の式に分散させず、一か所で明示したい場合。
ブランチの合流:NoOp を基準点にする
ブランチが合流する場合(IF/Switch/Merge の後)、$json は「最後に実行されたブランチのもの」になり、非決定的なうえ、誤ったデータが使われる原因を気づきにくくします。合流地点に NoOp ノードを挿入し、分かりやすい名前(Combine Inputs)を付けて、後続ノードから名前で参照します。
Branch A ──┐
├─→ [NoOp: Combine Inputs] ──→ downstream uses $('Combine Inputs').item.json.x
Branch B ──┘
NoOp はリファクタリング後も参照先として残ります。後から NoOp と使用側の間に変換処理を挿入しても、$('Combine Inputs') の参照は壊れません。(ブランチごとに異なる形のデータが出力される場合は、NoOp ではなく Set ノードを使って両方を同じ形に正規化します。上記の例外を参照してください。)
より一般的には、分岐の多いワークフローでは、深い階層の $json.x より $('Node').item.json.x を優先してください。 中間ノードが挿入されたときや、ノードがアイテムのコンテキストをクリアしたとき(Aggregate、Run for All を使う Code、分岐の合流など)、$json は機能しなくなります。エラーは通知されず、後続処理に誤ったデータが渡されます。ノード名で参照すれば、入力元と使用側の間にどのようなノードがあっても、参照先が曖昧になりません。
検証ルール
1. 常に {{}}
式は必ず二重中括弧で囲みます。
❌ $json.field
✅ {{$json.field}}
2. 空白や特殊文字には引用符を使う
空白、ダイアクリティカルマーク、特殊文字を含むフィールド名やノード名には、ブラケット記法が必要です。
❌ {{$json.field name}}
✅ {{$json['field name']}}
❌ {{$node.HTTP Request.json}}
✅ {{$node["HTTP Request"].json}}
// Bracket notation is mandatory for keys with special characters
✅ {{$json['Gross Price w/o shipment']}}
✅ {{$json['Cena brutto zł']}}
3. ノード名を完全一致させる
ノードの参照では、大文字と小文字が区別されます。
❌ {{$node["http request"].json}} // lowercase
❌ {{$node["Http Request"].json}} // wrong case
✅ {{$node["HTTP Request"].json}} // exact match
4. {{}} を入れ子にしない
式を二重に囲まないでください。
❌ {{{$json.field}}}
✅ {{$json.field}}
よくある間違い
修正方法を含むエラー一覧は、COMMON_MISTAKES.md を参照してください。
すぐにできる修正
| 間違い | 修正 |
|---|---|
$json.field | {{$json.field}} |
{{$json.field name}} | {{$json['field name']}} |
{{$node.HTTP Request}} | {{$node["HTTP Request"]}} |
{{{$json.field}}} | {{$json.field}} |
{{$json.name}}(webhook) | {{$json.body.name}} |
'={{$json.email}}'(Code ノード) | $json.email |
使用例
実際のワークフロー例は、EXAMPLES.md を参照してください。
例 1:Webhook から Slack へ
Webhook が受信する内容:
{
"body": {
"name": "John Doe",
"email": "[email protected]",
"message": "Hello!"
}
}
Slack ノードのテキストフィールド:
New form submission!
Name: {{$json.body.name}}
Email: {{$json.body.email}}
Message: {{$json.body.message}}
例 2:HTTP Request から Email へ
HTTP Request の戻り値:
{
"data": {
"items": [
{"name": "Product 1", "price": 29.99}
]
}
}
Email ノード内(HTTP Request を参照):
Product: {{$node["HTTP Request"].json.data.items[0].name}}
Price: ${{$node["HTTP Request"].json.data.items[0].price}}
例 3:タイムスタンプの形式設定
// Current date
{{$now.toFormat('yyyy-MM-dd')}}
// Result: 2025-10-20
// Time
{{$now.toFormat('HH:mm:ss')}}
// Result: 14:30:45
// Full datetime
{{$now.toFormat('yyyy-MM-dd HH:mm')}}
// Result: 2025-10-20 14:30
データ型の処理
配列
// First item
{{$json.users[0].email}}
// Array length
{{$json.users.length}}
// Last item
{{$json.users[$json.users.length - 1].name}}
オブジェクト
// Dot notation (no spaces)
{{$json.user.email}}
// Bracket notation (with spaces or dynamic)
{{$json['user data'].email}}
文字列
// Concatenation (automatic)
Hello {{$json.name}}!
// String methods
{{$json.email.toLowerCase()}}
{{$json.name.toUpperCase()}}
数値
// Direct use
{{$json.price}}
// Math operations
{{$json.price * 1.1}} // Add 10%
{{$json.quantity + 5}}
高度なパターン
条件付きコンテンツ
// Ternary operator
{{$json.status === 'active' ? 'Active User' : 'Inactive User'}}
// Default values
{{$json.email || '[email protected]'}}
日付の操作
// Add days
{{$now.plus({days: 7}).toFormat('yyyy-MM-dd')}}
// Subtract hours
{{$now.minus({hours: 24}).toISO()}}
// Set specific date
{{DateTime.fromISO('2025-12-25').toFormat('MMMM dd, yyyy')}}
文字列の操作
// Substring
{{$json.email.substring(0, 5)}}
// Replace
{{$json.message.replace('old', 'new')}}
// Split and join
{{$json.tags.split(',').join(', ')}}
パフォーマンス:式の複雑さは(ほぼ)コストになりません
複雑な {{ }} は遅いのではないかと心配されることがあります。しかし、そうではありません。コストがかかるのは式の複雑さではなく、n8n が式を評価する回数です。n8n 2.x での測定では、複雑な式(sqrt、split、reduce)のアイテムあたりのコストは {{ $json.x > 50 }} とほぼ同じです。コストの大半は、n8n がアイテムごとの評価コンテキストを構築するためにかかります。
実際には、次のことを意味します。
- 速度を上げるために、動作している短い式を複数のノードに分割しないでください。速度のために式を関数本体にまで拡張するのも避けてください。読みやすさで選びましょう。まずネイティブノード、次に短い式、それから上記の判断基準に従って Code を使います。
- アイテムごとのコストが影響するのは、数千件のアイテムを扱う場合だけです。主にアイテムごとの境界の数によって影響が生じます(「Each Item」モードの Code が最もコストの高いケースです)。測定済みのアイテムごとのモデルについては、n8n Code JavaScript スキルを参照してください。
式のデバッグ
実行時エラーはノードを失敗させず、null になります
デフォルトの式ランタイムを使った n8n 2.38 で確認済みです。実行時には、各 {{ }} を囲むハンドラーは n8n 独自の ExpressionError だけを再スローし、その他の JavaScript エラーは捕捉します。そのため、フィールドは空または null になり、ノードは成功と報告されます。$json.missing.field(TypeError)、JSON.parse('{bad')、throw new Error(...)、JMESPath の構文エラーはいずれも null になりました。Filter または IF 条件では、その後すべてのアイテムがチェックに黙って失敗します。別のバージョンや式エンジンでは、同じミスでノードが失敗することがあります。いずれの場合も、実行が緑色で完了しただけで信頼しないでください。
これは、式を避けるべきという意味ではありません(Code ノードにもそれ自体に気付きにくい落とし穴があります)。実際のアイテムでテストする必要があるということです。
- 実際のデータを使って、式エディターのプレビューを確認してください。プレビューにはエラーが表示されます。
- テスト実行後は、出力値を確認してください。データがあるはずの場所が
nullなら、それが症状です。validate_workflowと緑色の実行表示では分かりません。 - 実際のメッセージを表示するには、式を一時的に次のようにラップしてください。
{{ (() => { try { return JSON.stringify(<expr>) } catch (e) { return 'ERROR: ' + e.message } })() }} - n8n 独自のエラーでは、引き続きノードが失敗します(例:
$jmespathにオブジェクト以外の引数を渡した場合)。
式エディターでテストする
- 式を含むフィールドをクリックします
- 式エディターを開きます(「fx」アイコンをクリック)
- 結果のライブプレビューを確認します
- 赤く強調表示されたエラーがないか確認します
よくあるエラーメッセージ
これらはエディターのプレビューに表示されます。実行時には、その大半が代わりに null になります(上記を参照)。
「Cannot read property 'X' of undefined」 → 親オブジェクトが存在しません → データパスを確認してください
「X is not a function」 → 関数ではないものを呼び出そうとしています → 変数の型を確認してください
式がリテラルテキストとして表示される → {{ }} がありません → 中かっこを追加してください
式のヘルパー
使用可能なメソッド
文字列:
.toLowerCase()、.toUpperCase().trim()、.replace()、.substring().split()、.includes()
配列:
.length、.map()、.filter().find()、.join()、.slice()
DateTime(Luxon):
.toFormat()、.toISO()、.toLocal().plus()、.minus()、.set()
数値:
.toFixed()、.toString()- 数学演算:
+、-、*、/、%
JSON クエリ:
$jmespath(object, "query"):ネストされた JSON をフィルター処理、選択、集約します(引用符の規則については$jmespath()のセクションを参照してください)
ベストプラクティス
✅ Do
- 動的コンテンツには必ず {{ }} を使用します
- スペースを含むフィールド名にはブラケット記法を使用します
.bodyから Webhook データを参照します- 他のノードのデータには $node を使用します
- 式エディターで式をテストします
❌ Don't
- Code ノードでは式を使用しないでください
- スペースを含むノード名を引用符で囲み忘れないでください
- 余分な {{ }} で二重に囲まないでください
- Webhook データがルートにあると思い込まないでください(
.bodyの下にあります!) - Webhook のパスや認証情報では式を使用しないでください
関連スキル
- n8n MCP Tools Expert:MCP ツールを使って式を検証する方法を学びます
- n8n Workflow Patterns:実際のワークフローの例で式を確認します
- n8n Node Configuration:式が必要な場面を理解します
まとめ
必須ルール:
- 式を {{ }} で囲みます
- Webhook データは
.bodyの下にあります - Code ノードでは {{ }} を使用しません
- スペースを含むノード名は引用符で囲みます
- ノード名では大文字と小文字が区別されます
{{ }}内の実行時エラーは、通知されずにnullになります。テスト実行後に出力値を確認してください$jmespath(object, "query"):'string'、`number`、"field"。.all()よりjson.プレフィックスを使用します
よくある間違い:
- {{ }} がない → 波括弧を追加します
- Webhook で
{{$json.name}}を使用 →{{$json.body.name}}を使用します - Code で
{{$json.email}}を使用 →$json.emailを使用します {{$node.HTTP Request}}→{{$node["HTTP Request"]}}を使用します
詳細については、以下を参照してください:
- COMMON_MISTAKES.md - エラー一覧
- EXAMPLES.md - 実際のワークフロー例
お困りですか? n8n の式のドキュメントを参照するか、n8n-mcp 検証ツールを使って式を確認してください。