1. $json — dữ liệu JSON của item hiện tại
Đây là cái bạn đang dùng nhiều nhất.
$json
Nó đại diện cho JSON của item hiện tại đang được Code node xử lý.
Ví dụ node Telegram đưa vào:
{
"message": {
"from": {
"id": 774936272,
"first_name": "Đạt"
},
"text": "/wol 192.168.1.100"
}
}
Trong Code node:
$json.message.text
→
/wol 192.168.1.100
Hoặc:
$json.message.from.id
→
774936272
Trong code của bạn
Bạn viết:
const u = $json;
Tức là:
$json
↓
u
Sau đó:
u.message
thay vì:
$json.message
Tôi thường dùng $json khi:
Bạn chỉ cần dữ liệu của node hiện tại.
Ví dụ:
const name = $json.name;
const uid = $json.uid;
const input = $json.input;
2. $input — lấy dữ liệu đầu vào của Code node
Đây là cái tiếp theo bạn nên học kỹ.
Nếu $json là:
“Dữ liệu JSON hiện tại”
thì $input có thể hiểu là:
“Tôi muốn lấy dữ liệu được đưa vào node này.”
Ví dụ Code node nhận dữ liệu:
{
"name": "Đạt"
}
Bạn có thể dùng:
$input.first().json
để lấy item đầu tiên.
Kết quả:
{
"name": "Đạt"
}
$input.first()
Lấy item đầu tiên.
$input.first()
Ví dụ đầu vào có:
Item 1
Item 2
Item 3
thì:
$input.first()
→ Item 1.
$input.all()
Lấy tất cả item.
Ví dụ Code node nhận:
Item 1
Item 2
Item 3
thì:
$input.all()
→ cả 3 item.
Ví dụ:
const items = $input.all();
return items;
Bạn sẽ dùng cái này khi muốn xử lý nhiều item một lúc.
Ví dụ rất thực tế
Giả sử node trước trả:
[
{
"uid": 111,
"name": "Dat"
},
{
"uid": 222,
"name": "Nam"
},
{
"uid": 333,
"name": "An"
}
]
Code:
const items = $input.all();
return items;
lấy toàn bộ dữ liệu.
3. $item — item hiện tại
Phần này bạn cần chú ý một chút vì n8n hiện đại ưu tiên $json và $input hơn, còn $item chủ yếu xuất hiện trong các workflow/code cũ hoặc một số context cụ thể.
Ý tưởng của $item là:
Item đang được xử lý tại vị trí hiện tại.
Ví dụ có:
Item 1
Item 2
Item 3
thì mỗi item có dữ liệu riêng.
Trong cách viết cũ, bạn có thể gặp những thứ kiểu:
$item(0)
để tham chiếu item.
Tuy nhiên, khi viết Code node mới, tôi khuyên bạn không nên bắt đầu bằng $item.
Hãy ưu tiên:
$json
hoặc:
$input.first()
$input.all()
4. $node — truy cập dữ liệu của node khác
Đây là một biến rất mạnh.
Giả sử workflow:
Telegram Trigger
↓
Chuẩn hóa Telegram
↓
IF Permission
↓
WOL
Bạn đang ở node:
WOL
nhưng muốn lấy dữ liệu từ node:
Chuẩn hóa Telegram
Bạn có thể tham chiếu node đó.
Ví dụ về mặt ý tưởng:
$node["Chuẩn hóa Telegram"]
Sau đó truy cập dữ liệu JSON của node.
Ví dụ:
$node["Chuẩn hóa Telegram"].json.uid
→ UID.
Hoặc:
$node["Chuẩn hóa Telegram"].json.commandName
→ /wol.
Ví dụ
Node Chuẩn hóa Telegram trả:
{
"uid": 774936272,
"permission": true,
"commandName": "/wol"
}
Node phía sau có thể tham chiếu dữ liệu đó.
Ý tưởng:
Chuẩn hóa Telegram
│
├── uid
├── permission
└── commandName
↓
WOL
Nhưng có một cách tôi khuyên dùng hơn
Nếu dữ liệu đã được truyền qua node trước:
$json.uid
thì không cần quay lại $node.
Chỉ dùng tham chiếu node khác khi thực sự cần.
5. $execution — thông tin về lần chạy workflow
Đây là biến dành cho thông tin execution.
Bạn có thể hiểu:
Workflow này đang chạy lần thứ nào? Execution ID là gì? Workflow chạy lúc nào?…
Ví dụ:
$execution.id
có thể lấy Execution ID của lần chạy hiện tại.
Điều này hữu ích khi debug.
Ví dụ bạn muốn log:
return {
json: {
executionId: $execution.id
}
};
Có thể cho ra:
{
"executionId": "12345"
}
Tưởng tượng thế này
Mỗi lần Telegram gửi command:
/wol
n8n tạo một execution:
Execution #1001
Người khác gửi:
/status
n8n tạo:
Execution #1002
$execution cho phép bạn biết thông tin về lần chạy hiện tại.
6. $workflow — thông tin workflow hiện tại
$workflow đại diện cho workflow đang chạy.
Ví dụ về mặt khái niệm:
$workflow.id
→ ID workflow.
$workflow.name
→ tên workflow.
Ví dụ workflow của bạn tên:
Telegram Control
thì có thể lấy thông tin workflow hiện tại qua $workflow.
So sánh 6 biến
Bạn có thể nhớ bằng bảng này:
| Biến | Hiểu đơn giản |
|---|---|
$json | Dữ liệu JSON hiện tại |
$input | Dữ liệu đầu vào của node |
$item | Item hiện tại — cách cũ/context cụ thể |
$node | Truy cập dữ liệu node khác |
$execution | Thông tin lần chạy workflow |
$workflow | Thông tin workflow hiện tại |
Cách nhớ cực dễ
Hãy tưởng tượng workflow của bạn là một nhà máy:
Telegram
↓
Chuẩn hóa
↓
Kiểm tra quyền
↓
WOL
$json
“Dữ liệu tôi đang cầm trên tay là gì?”
$json
$input
“Node này nhận vào những gì?”
$input.all()
$item
“Tôi đang xử lý item nào?”
$node
“Tôi muốn quay sang lấy dữ liệu của node nào?”
$node["Chuẩn hóa Telegram"]
$execution
“Lần chạy workflow hiện tại là lần nào?”
$execution.id
$workflow
“Tôi đang ở workflow nào?”
$workflow.id
3 cái bạn sẽ dùng nhiều nhất
Với workflow n8n của bạn, tôi khuyên tập trung trước vào:
🥇 $json
Dùng hàng ngày.
$json.input
$json.uid
$json.permission
🥈 $input
Khi cần xử lý nhiều dữ liệu:
$input.all()
hoặc item đầu tiên:
$input.first()
🥉 $node
Khi cần lấy dữ liệu từ một node khác:
$node["Tên node"].json
Ví dụ kết hợp cả 3
Giả sử workflow:
Telegram Trigger
↓
Chuẩn hóa
↓
Xử lý WOL
Node Chuẩn hóa trả:
{
"input": "/wol 192.168.1.100",
"uid": 774936272,
"permission": true,
"command": true,
"commandName": "/wol"
}
Tại node Xử lý WOL, nếu dữ liệu được truyền trực tiếp:
const input = $json.input;
const uid = $json.uid;
const permission = $json.permission;
Đây là cách đơn giản nhất.
Nếu muốn lấy trực tiếp từ node Chuẩn hóa:
const data = $node["Chuẩn hóa"].json;
const input = data.input;
const uid = data.uid;
const permission = data.permission;
Còn nếu muốn lấy toàn bộ input của node:
const items = $input.all();