理解节点概念
深入了解N8N节点系统,掌握工作流的核心构建块
理解节点概念
节点是 N8N 工作流的基本构建块。每个节点代表一个特定的操作、服务或功能。理解不同类型的节点及其工作原理,是掌握 N8N 的关键。
🎯 节点基础概念
什么是节点?
节点是工作流中的一个执行单元,它可以:
- 接收输入数据
- 执行特定操作
- 输出处理后的数据
- 连接到其他节点
节点的组成部分
每个节点包含以下元素:
- 输入连接点:接收来自其他节点的数据
- 输出连接点:向其他节点发送数据
- 配置面板:设置节点的参数和选项
- 执行状态:显示节点的运行结果
🔗 节点类型详解
1. 触发节点 (Trigger Nodes)
触发节点是工作流的起点,它们监听事件或按计划启动工作流。
📅 定时触发器
Cron 节点
// 每天上午9点执行
"0 9 * * *"
// 每周一上午10点执行
"0 10 * * 1"
// 每月1号中午12点执行
"0 12 1 * *"
Interval 节点
// 每5分钟执行一次
interval: 5 minutes
// 每2小时执行一次
interval: 2 hours
🔔 事件触发器
Webhook 节点
// 监听HTTP请求
POST https://your-n8n.com/webhook/user-signup
{
"userId": "12345",
"email": "[email protected]",
"event": "signup"
}
File Trigger 节点
// 监听文件变化
path: "/uploads"
events: ["add", "change", "unlink"]
2. 动作节点 (Action Nodes)
动作节点执行具体的操作,如发送邮件、调用API、处理数据等。
📧 通讯节点
Gmail 节点
// 发送邮件配置
operation: "Send Email"
to: "{{ $json.email }}"
subject: "欢迎注册!"
body: "感谢您的注册..."
钉钉 节点
// 发送群消息
operation: "Send Message"
webhook: "your-dingtalk-webhook-url"
message: "系统告警:{{ $json.alertMessage }}"
🌐 API 集成节点
HTTP Request 节点
// GET 请求
method: "GET"
url: "https://api.github.com/users/{{ $json.username }}"
// POST 请求
method: "POST"
url: "https://api.example.com/users"
body: {
"name": "{{ $json.name }}",
"email": "{{ $json.email }}"
}
💾 数据存储节点
MySQL 节点
-- 查询操作
SELECT * FROM users WHERE email = '{{ $json.email }}'
-- 插入操作
INSERT INTO orders (user_id, product_id, amount)
VALUES ({{ $json.userId }}, {{ $json.productId }}, {{ $json.amount }})
3. 逻辑节点 (Logic Nodes)
逻辑节点控制工作流的执行路径和数据处理。
🔀 流程控制
IF 节点
// 条件判断
{{ $json.age >= 18 }}
// 复合条件
{{ $json.isVIP === true && $json.points > 1000 }}
Switch 节点
// 多路分支
switch ($json.status) {
case "pending": return 0;
case "approved": return 1;
case "rejected": return 2;
default: return 3;
}
⏱️ 时间控制
Wait 节点
// 等待固定时间
amount: 5
unit: "minutes"
// 等待到特定时间
until: "2024-12-25T00:00:00Z"
Schedule Trigger 节点
// 工作日上午9点
rule: "0 9 * * 1-5"
timezone: "Asia/Shanghai"
4. 数据处理节点
🔧 数据转换
Set 节点
// 设置新字段
{
"fullName": "{{ $json.firstName }} {{ $json.lastName }}",
"email": "{{ $json.email }}",
"createdAt": "{{ new Date().toISOString() }}",
"isAdult": "{{ $json.age >= 18 }}"
}
Function 节点
// JavaScript 函数处理
const items = $input.all();
const processed = items.map(item => {
return {
...item.json,
processedAt: new Date().toISOString(),
score: item.json.value * 2
};
});
return processed;
Code 节点
// 复杂数据处理
for (const item of $input.all()) {
const data = item.json;
// 数据清洗
const cleanedData = {
id: data.id,
name: data.name?.trim(),
email: data.email?.toLowerCase(),
phone: data.phone?.replace(/\D/g, ''),
tags: data.tags?.filter(tag => tag.length > 0)
};
$return.push({ json: cleanedData });
}
📊 数据聚合
Aggregate 节点
// 按类别聚合
aggregation: {
keys: ["category"],
values: {
totalSales: { field: "amount", operation: "sum" },
avgPrice: { field: "price", operation: "average" },
itemCount: { field: "id", operation: "count" }
}
}
🔧 节点配置技巧
1. 表达式语法
N8N 使用双花括号语法来引用数据:
// 基本引用
{{ $json.fieldName }}
// 上一个节点数据
{{ $('NodeName').item.json.data }}
// 条件表达式
{{ $json.score > 80 ? 'Pass' : 'Fail' }}
// 数组操作
{{ $json.items.length }}
{{ $json.items[0].name }}
// 日期处理
{{ new Date().toISOString() }}
{{ new Date($json.date).getFullYear() }}
// 字符串操作
{{ $json.name.toUpperCase() }}
{{ $json.email.includes('@gmail.com') }}
2. 环境变量使用
// 引用环境变量
{{ $env.API_KEY }}
{{ $env.DATABASE_URL }}
// 条件使用环境变量
{{ $env.NODE_ENV === 'production' ? 'prod-server' : 'dev-server' }}
3. 错误处理配置
// 在节点设置中配置错误处理
Continue On Fail: true
Retry On Fail: 3
Retry Interval: 1000 // 毫秒
📋 实战示例:用户数据处理流水线
创建一个完整的用户数据处理工作流:
1. 数据输入 (HTTP Request)
// 从API获取用户数据
GET https://jsonplaceholder.typicode.com/users
2. 数据清洗 (Function)
const users = $input.all();
const cleanedUsers = users.map(user => {
const data = user.json;
return {
id: data.id,
name: data.name.trim(),
email: data.email.toLowerCase(),
phone: data.phone.replace(/\D/g, ''),
company: data.company?.name || 'Unknown',
address: `${data.address.city}, ${data.address.zipcode}`,
website: data.website.startsWith('http') ? data.website : `https://${data.website}`
};
});
return cleanedUsers.map(user => ({ json: user }));
3. 数据验证 (IF)
// 验证邮箱格式
{{ /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test($json.email) }}
4. 数据分类 (Switch)
// 根据邮箱域名分类
const domain = $json.email.split('@')[1];
switch (domain) {
case 'gmail.com': return 0; // 个人用户
case 'company.com': return 1; // 企业用户
default: return 2; // 其他用户
}
5. 数据存储 (MySQL)
INSERT INTO users (name, email, phone, company, address, category, created_at)
VALUES (
'{{ $json.name }}',
'{{ $json.email }}',
'{{ $json.phone }}',
'{{ $json.company }}',
'{{ $json.address }}',
'{{ $json.category }}',
NOW()
)
🎯 节点选择指南
根据需求选择节点
需求类型 | 推荐节点 | 备选方案 |
---|---|---|
定时执行 | Cron | Schedule Trigger |
接收请求 | Webhook | HTTP Request |
发送邮件 | Gmail | SMTP |
数据库操作 | MySQL/PostgreSQL | HTTP Request + API |
文件处理 | Read/Write Binary File | Google Drive |
数据转换 | Set | Function |
条件判断 | IF | Switch |
API调用 | HTTP Request | 专用API节点 |
性能优化建议
// 1. 减少不必要的数据传递
// 只选择需要的字段
.select(['id', 'name', 'email'])
// 2. 批量处理数据
// 使用批量操作而不是循环单个处理
INSERT INTO table VALUES
{{ $json.items.map(item => `('${item.name}', '${item.email}')`).join(',') }}
// 3. 合理使用缓存
// 在Function节点中缓存重复计算结果
const cache = new Map();
🚀 下一步学习
现在你已经理解了节点的基本概念,可以继续学习:
节点是 N8N 的核心概念。通过合理组合不同类型的节点,你可以构建出强大而灵活的自动化工作流。继续实践和探索,发现更多节点的强大功能!