跳轉到

n8n Expression 完全指南

這份筆記專門處理一件事:讓你真正看懂、寫對、除錯 n8n expression。

想一想

Expression 對初學者來說最像咒語,因為它常常長得像一串奇怪符號。但你可以先不要把它想成程式碼,而是把它想成「指路」。當 n8n 前面某個節點已經拿到資料,後面的節點要使用那個資料時,就需要 expression 告訴 n8n:我要的是哪一格、哪一欄、哪一個物件裡面的哪個值。

例如一張表單送進來,有姓名、email、需求內容。你在寄信節點裡不會每次手動打姓名,而是用 expression 說:「請去前面的資料裡拿姓名」。所以 expression 的核心不是炫技,而是精準取資料。學它時,不要急著背所有語法;先練會看 JSON 結構,再練會從目前節點取值、從前面節點取值、遇到空值時怎麼處理。只要這三件事穩,後面複雜寫法都只是延伸。

本篇怎麼讀

  • 學習目標:把 expression 從「看起來像咒語」變成可理解的取值工具
  • 先修需求:至少知道 JSON 是什麼
  • 讀完後你應該能:自己寫常見欄位路徑、判斷式、字串拼接與陣列取值

目錄

  1. Expression 到底是什麼
  2. 先建立正確心智模型
  3. 最常見的基本語法
  4. 讀取目前節點與其他節點的資料
  5. 處理字串、數字、布林
  6. 物件與陣列取值
  7. 條件判斷與三元運算
  8. 常見實戰寫法
  9. 最常見錯誤與除錯方式
  10. Appendix. 速查表與練習題

1. Expression 到底是什麼

Expression 是 n8n 用來「動態取資料」與「動態算結果」的方式。

你可以把它理解成: - 從前面節點讀值 - 用讀到的值做拼接 - 根據條件產出不同結果

例如:

{{$json.name}}

意思是:從目前這筆資料中,取出 name 欄位。

再例如:

{{"Hello " + $json.name}}

意思是:把 Hello 跟目前資料的 name 組成一段文字。


2. 先建立正確心智模型

Expression 不是魔法。它只是: 1. 找到資料 2. 讀出欄位 3. 必要時做運算 4. 回傳結果

你只要先知道資料長什麼樣子,expression 就不會太難。

所以最重要的前提永遠是: 先看 output,再寫 expression。

如果你連 output 的 JSON 結構都沒看,就直接猜路徑,通常會錯。


3. 最常見的基本語法

3.1 目前整筆資料

{{$json}}

3.2 目前資料中的欄位

{{$json.name}}
{{$json.email}}
{{$json.score}}

3.3 字串拼接

{{"Hello " + $json.name}}
{{"Email: " + $json.email}}

3.4 布林結果

{{$json.score >= 60}}
{{$json.paid === true}}

3.5 三元運算

{{$json.score >= 80 ? "VIP" : "Regular"}}
{{$json.paid ? "paid" : "unpaid"}}

4. 讀取目前節點與其他節點的資料

4.1 讀目前節點

{{$json.name}}
{{$json.body.email}}

4.2 讀特定節點

{{$node["Webhook"].json.body.name}}
{{$node["HTTP Request"].json.id}}
{{$node["Set User"].json.email}}

4.3 什麼時候要讀其他節點

當中間節點有改資料結構,或你想直接拿某一步的原始值時,才去讀特定節點。

實務上原則是: - 能用目前 $json 就先用 $json - 只有必要時才跨節點引用

因為跨節點引用比較容易在 workflow 改名或重構後壞掉。


5. 處理字串、數字、布林

5.1 字串

{{"User: " + $json.name}}
{{"Course: " + $json.course}}

5.2 數字比較

{{$json.amount > 1000}}
{{$json.score >= 60}}

5.3 布林判斷

{{$json.paid}}
{{$json.paid ? "paid" : "unpaid"}}

5.4 最常出錯的地方

數字有時不是數字,而是字串。

例如 webhook 送來:

{
  "score": "85"
}

看起來像數字,但實際上是字串。這種情況條件判斷要更小心。


6. 物件與陣列取值

6.1 巢狀物件

{
  "user": {
    "name": "Tung",
    "profile": {
      "city": "Taipei"
    }
  }
}

取值:

{{$json.user.name}}
{{$json.user.profile.city}}

6.2 陣列

{
  "items": [
    {"title": "A"},
    {"title": "B"}
  ]
}

取第一筆:

{{$json.items[0].title}}

6.3 物件和陣列常見誤判

很多人會把這兩個搞混: - 物件:user.name - 陣列:items[0].title

如果你把陣列當物件,expression 就會失敗。


7. 條件判斷與三元運算

7.1 最基本判斷

{{$json.score >= 60}}
{{$json.amount > 0}}
{{$json.status === "published"}}

7.2 三元運算

{{$json.score >= 80 ? "VIP" : "Regular"}}
{{$json.paid ? "Success" : "Pending"}}

7.3 什麼時候適合三元運算

當你只需要根據一個條件產出簡短結果時,三元運算很方便。

如果邏輯變得很長,通常改用: - IF node - Set 先拆欄位 - Code node 處理更複雜邏輯


8. 常見實戰寫法

8.1 Webhook 讀 body

{{$json.body.name}}
{{$json.body.email}}
{{$json.body.course}}

8.2 組通知訊息

{{"New order from " + $json.order_name + " (" + $json.order_email + ")"}}

8.3 判斷付款狀態

{{$json.paid ? "paid" : "unpaid"}}

8.4 API 回傳整理

{{$json.data.id}}
{{$json.data.title}}
{{$json.data.items[0].name}}

8.5 產出 prompt

{{"請將以下內容整理成三點摘要:" + $json.content}}

8.6 一個完整的小案例

假設 webhook 收到:

{
  "body": {
    "name": "Tung",
    "amount": 1200,
    "paid": true
  }
}

你可能會在 Set 裡這樣寫:

{{$json.body.name}}
{{$json.body.amount}}
{{$json.body.paid ? "paid" : "unpaid"}}
{{"Order from " + $json.body.name}}

這個案例很典型,因為它同時示範了: - 巢狀物件取值 - 數值欄位讀取 - 三元運算 - 字串組合


9. 最常見錯誤與除錯方式

9.1 錯誤 1:路徑寫錯

資料在:

{
  "body": {
    "name": "Tung"
  }
}

錯誤寫法:

{{$json.name}}

正確寫法:

{{$json.body.name}}

9.2 錯誤 2:節點名稱改了

原本:

{{$node["Set User"].json.name}}

如果節點改名,這段就可能失效。

9.3 錯誤 3:把陣列當物件

如果資料是:

{
  "items": [
    {"title": "A"}
  ]
}

你不能寫:

{{$json.items.title}}

要寫:

{{$json.items[0].title}}

9.4 除錯步驟

  1. 先看上一個節點 output
  2. 確定欄位實際在哪裡
  3. 確認型別是不是你以為的那種
  4. 再寫 expression
  5. 執行後再回來驗證

9.5 expression 的實務原則

  • 先短後長:先寫最短可用路徑
  • 先穩後炫:先取到值,再談漂亮寫法
  • $json$node:能不跨節點就不跨
  • 先拆欄位再判斷:複雜資料先用 Set 整理

Appendix. 速查表與練習題

A.1 速查表

{{$json}}
{{$json.name}}
{{$json.body.email}}
{{$json.items[0].title}}
{{$json.score >= 80 ? "VIP" : "Regular"}}
{{"Hello " + $json.name}}
{{$node["Webhook"].json.body.name}}

A.2 練習題

  1. 如果資料在 body.amount,你要怎麼取值?
  2. 如果第一筆商品名稱在 items[0].name,expression 怎麼寫?
  3. 如果 paid = true 時要回傳 success,否則 pending,expression 怎麼寫?
  4. 為什麼初學者應該優先用 $json 而不是一直跨節點讀值?

本篇練習

  1. 自己造 3 份不同 JSON,寫出對應 expression。
  2. 各做一次:物件取值、陣列取值、三元運算、字串拼接。
  3. 把一個錯的 expression 改對,說出錯在哪裡。

下一篇建議

如果你發現問題其實不在 expression,而在 API 本身,下一步讀 05 n8n API 串接觀念與除錯手冊