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$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ếnHiểu đơn giản
$jsonDữ liệu JSON hiện tại
$inputDữ liệu đầu vào của node
$itemItem hiện tại — cách cũ/context cụ thể
$nodeTruy cập dữ liệu node khác
$executionThông tin lần chạy workflow
$workflowThô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();