第 10 期:内置工具锦囊 — Merge、Set、Edit Image 节点大串烧

⏱ 预计阅读 12 分钟 更新于 2026/4/9

工具节点全景速览

这些节点可能不像 AI Agent 那样"酷炫",但它们是你每天都在用的瑞士军刀

graph TB
    subgraph "n8n 实用工具节点地图"
        direction LR
        Set[⚙️ Set/Edit Fields
添加/修改/删除字段] Merge[🔗 Merge
合并多个数据流] Filter[🔍 Filter
按条件过滤] Sort[📊 Sort
排序] Limit[✂️ Limit
截取前 N 条] Remove[🗑️ Remove Duplicates
去重] DateTime[🕐 Date & Time
时间运算] Crypto[🔐 Crypto
加密/哈希] Image[🖼️ Edit Image
图片处理] Convert[🔄 Convert to File
格式转换] end style Set fill:#22c55e,stroke:#16a34a,color:#fff style Merge fill:#6366f1,stroke:#4f46e5,color:#fff

1. Set / Edit Fields 节点

使用频率:⭐⭐⭐⭐⭐ (几乎每个工作流都用)

// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// Set 节点的三大操作模式
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

// 模式1: 添加新字段 (Add)
// - 字段名: fullName
// - 值: {{ $json.firstName + ' ' + $json.lastName }}
// 输入: { firstName: "三", lastName: "张" }
// 输出: { firstName: "三", lastName: "张", fullName: "三 张" }

// 模式2: 仅保留指定字段 (Keep Only Set)
// ☑️ 开启 "Keep Only Set" 选项
// - 只保留 fullName 和 email
// 输入: { firstName: "三", lastName: "张", phone: "138...", email: "[email protected]" }
// 输出: { fullName: "三 张", email: "[email protected]" }
//   ← firstName, lastName, phone 被移除

// 模式3: 使用表达式动态计算
// - 字段名: discountPrice
// - 值: {{ Math.round($json.price * 0.85) }}     // 85 折
// - 字段名: isExpensive
// - 值: {{ $json.price > 500 }}                    // 布尔值

2. Merge 节点 — 多流合并

使用频率:⭐⭐⭐⭐

graph TB
    subgraph "Merge 的三种核心模式"
        direction LR
        
        subgraph "Append (追加)"
            A1[流 1: 3 Items] --> MA[Merge]
            A2[流 2: 2 Items] --> MA
            MA --> AR[输出: 5 Items]
        end
        
        subgraph "Combine by Position (按位置配对)"
            B1["流 1: [A, B, C]"] --> MB[Merge]
            B2["流 2: [1, 2, 3]"] --> MB
            MB --> BR["输出: [A+1, B+2, C+3]"]
        end
        
        subgraph "Combine by Field (按字段 JOIN)"
            C1["用户: [{id:1, name:'张三'}]"] --> MC[Merge]
            C2["订单: [{uid:1, amt:99}]"] --> MC
            MC --> CR["输出: [{id:1, name:'张三', amt:99}]"]
        end
    end
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// Merge 节点 "Combine by Field" 配置 (最常用)
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

// 模式: Combine
// Combination Mode: Merge By Fields
// 
// 输入 1 匹配字段: id          ← 用户表的主键
// 输入 2 匹配字段: userId      ← 订单表的外键
// 
// Join Mode:
//   - Inner Join: 只保留两边都有的   (类似 SQL INNER JOIN)
//   - Left Join:  保留输入1的全部     (类似 SQL LEFT JOIN)
//   - Outer Join: 保留两边全部       (类似 SQL FULL JOIN)
//
// 冲突解决: 如果两边有同名字段,以输入 1 / 输入 2 为准

3. Date & Time 节点

使用频率:⭐⭐⭐

// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// n8n 内置时间表达式 (基于 Luxon 库)
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

// 当前时间
{{ $now }}                              // DateTime 对象
{{ $now.toISO() }}                      // "2026-04-09T12:30:00.000+08:00"
{{ $now.toFormat('yyyy年MM月dd日') }}    // "2026年04月09日"
{{ $now.toFormat('HH:mm:ss') }}         // "12:30:00"

// 时间加减
{{ $now.plus({ days: 7 }) }}            // 7 天后
{{ $now.minus({ hours: 2 }) }}          // 2 小时前
{{ $now.startOf('month') }}             // 本月第一天 00:00

// 时间比较
{{ $now.diff($json.createdAt, 'days').days }}   // 距今多少天
{{ DateTime.fromISO($json.deadline) > $now }}   // 是否已过期

// 时区转换
{{ $now.setZone('America/New_York').toFormat('HH:mm') }}  // 纽约时间

// Date & Time 节点操作:
// - Format Date:  将日期字段格式化为指定格式
// - Add/Subtract: 日期加减
// - Round Date:   取整到天/小时/分钟(用于分组统计)
// - Get Between:  计算两个日期之间的差值

4. Edit Image 节点

// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// Edit Image 节点支持的操作
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

// 🔄 调整尺寸 (Resize)
// - Width: 800, Height: 600
// - 保持纵横比: true

// ✂️ 裁剪 (Crop)
// - X: 100, Y: 100, Width: 500, Height: 500

// 🔤 添加文字水印 (Text)
// - Text: "© 2026 AgentUpdate.ai"
// - Font Size: 24
// - Position: Bottom Right
// - Color: #ffffff80 (带透明度的白色)

// 🔄 格式转换
// - 输入 PNG → 输出 WebP (减小 60% 体积)
// - 输入 JPEG → 输出 PNG (无损)

// ⚠️ 注意: 图片数据通过 Item 的 binary 字段传递
// 确保上游节点携带了 binary 数据

5. 其他高频节点

Filter / Limit / Sort / Remove Duplicates

// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 这些节点通常组合使用,形成数据清洗管道
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

// Filter: 按条件过滤
// 条件: {{ $json.status === "active" && $json.age >= 18 }}

// Sort: 排序
// 字段: price
// 方向: Descending (降序)

// Limit: 取前 N 条
// Max Items: 10  (只保留前 10 条)

// Remove Duplicates: 去重
// Compare: 按字段 email 去重
// 保留: 第一次出现的 (First)

经典组合:数据清洗管道

graph LR
    Raw[原始数据
100 Items] --> Filter[Filter
status=active] Filter --> Dedup[Remove Duplicates
按 email] Dedup --> Sort[Sort
按 score 降序] Sort --> Limit[Limit
Top 10] Limit --> Clean[清洁数据
10 Items ✨] style Clean fill:#22c55e,stroke:#16a34a,color:#fff

模块二总结

mindmap
  root((模块二: 逻辑控制与数据加工))
    Ep 06 分支控制
      If 节点 (二路分流)
      Switch 节点 (多路路由)
      Loop Over Items (显式循环)
    Ep 07 Data Tables
      CRUD 全操作
      防重复处理
    Ep 08 HTTP Request
      认证方式 (API Key / OAuth2)
      分页遍历
      错误重试
    Ep 09 Code Node
      JS 两种模式
      Python 支持
      内置变量/跨节点引用
    Ep 10 工具节点
      Set (字段操作)
      Merge (多流合并)
      Date & Time
      Filter / Sort / Limit

下一步

恭喜完成模块二!你已经掌握了构建复杂工作流的全部基础组件。从 Ep 11 开始,我们正式进入 AI Agent 领域——学习如何给 n8n 工作流接入大语言模型,让它从"执行机器"变为"思考型智能体"。