n8n Expression 完全指南¶
這份筆記專門處理一件事:讓你真正看懂、寫對、除錯 n8n expression。
想一想¶
Expression 對初學者來說最像咒語,因為它常常長得像一串奇怪符號。但你可以先不要把它想成程式碼,而是把它想成「指路」。當 n8n 前面某個節點已經拿到資料,後面的節點要使用那個資料時,就需要 expression 告訴 n8n:我要的是哪一格、哪一欄、哪一個物件裡面的哪個值。
例如一張表單送進來,有姓名、email、需求內容。你在寄信節點裡不會每次手動打姓名,而是用 expression 說:「請去前面的資料裡拿姓名」。所以 expression 的核心不是炫技,而是精準取資料。學它時,不要急著背所有語法;先練會看 JSON 結構,再練會從目前節點取值、從前面節點取值、遇到空值時怎麼處理。只要這三件事穩,後面複雜寫法都只是延伸。
本篇怎麼讀¶
- 學習目標:把 expression 從「看起來像咒語」變成可理解的取值工具
- 先修需求:至少知道 JSON 是什麼
- 讀完後你應該能:自己寫常見欄位路徑、判斷式、字串拼接與陣列取值
目錄¶
- Expression 到底是什麼
- 先建立正確心智模型
- 最常見的基本語法
- 讀取目前節點與其他節點的資料
- 處理字串、數字、布林
- 物件與陣列取值
- 條件判斷與三元運算
- 常見實戰寫法
- 最常見錯誤與除錯方式
- 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 除錯步驟¶
- 先看上一個節點 output
- 確定欄位實際在哪裡
- 確認型別是不是你以為的那種
- 再寫 expression
- 執行後再回來驗證
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 練習題¶
- 如果資料在
body.amount,你要怎麼取值? - 如果第一筆商品名稱在
items[0].name,expression 怎麼寫? - 如果
paid = true時要回傳success,否則pending,expression 怎麼寫? - 為什麼初學者應該優先用
$json而不是一直跨節點讀值?
本篇練習¶
- 自己造 3 份不同 JSON,寫出對應 expression。
- 各做一次:物件取值、陣列取值、三元運算、字串拼接。
- 把一個錯的 expression 改對,說出錯在哪裡。
下一篇建議¶
如果你發現問題其實不在 expression,而在 API 本身,下一步讀 05 n8n API 串接觀念與除錯手冊。