Skip to content

n8n 工作流自动化指南 ​

1. 简介 ​

n8n (Nodemation) 是一款基于节点的可扩展工作流自动化工具。它可以将不同的服务(如 Google Sheets, Slack, GitHub, 数据库等)通过“节点”连接起来,实现跨应用的数据传输和任务自动化。

核心优势:

  • 开源自托管:不同于 Zapier 或 IFTTT 的闭源收费模式,n8n 代码开源且支持私有化部署,数据安全性更高。
  • 可视化编排:通过拖拽节点和连线即可构建复杂的逻辑。
  • 灵活性:内置数百种集成,同时支持执行自定义 JavaScript 代码。
  • 免费版功能强大:个人或小团队自托管版本功能完整。

适用场景:定期报表生成、Webhook 消息转发、跨系统数据同步、自动化运维脚本等。

2. 安装部署 ​

n8n 基于 Node.js 开发,推荐使用 Docker 进行生产环境部署。

2.1 Docker Compose 部署 (推荐) ​

创建一个 docker-compose.yml 文件,持久化数据到本地。

yaml
version: "3"
services:
  n8n:
    image: n8nio/n8n
    restart: always
    ports:
      - "5678:5678"
    environment:
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=admin
      - N8N_BASIC_AUTH_PASSWORD=your_secure_password
      - N8N_HOST=n8n.example.com
      - WEBHOOK_URL=https://n8n.example.com/
      - GENERIC_TIMEZONE=Asia/Shanghai
    volumes:
      - ./n8n_data:/home/node/.n8n

启动命令:

bash
docker-compose up -d

2.2 npm 安装 (本地测试) ​

如果你已经安装了 Node.js 环境,可以直接通过 npm 安装。

bash
# 全局安装
npm install n8n -g

# 启动服务
n8n start

3. 核心概念与节点详解 ​

3.1 节点类型 ​

n8n 的节点主要分为三类:

  1. Trigger Nodes (触发器):工作流的起点。

    • Cron: 定时触发(如每天早上 9 点)。
    • Webhook: 接收 HTTP 请求触发(支持 GET/POST)。
    • App Triggers: 特定应用事件(如 GitHub Star, Slack 消息)。
  2. Regular Nodes (操作节点):执行具体任务。

    • HTTP Request: 发送任意 API 请求(最常用)。
    • Set: 设置或转换变量。
    • Code: 执行自定义 JavaScript 代码。
    • 应用集成节点:如 Google Sheets, Telegram, MySQL 等。
  3. Flow Nodes (逻辑节点):控制执行流程。

    • If: 条件判断(如:如果价格 > 100 则发送邮件)。
    • Switch: 多路分支。
    • Merge: 合并多路数据。
    • SplitInBatches: 批量处理(循环)。

3.2 数据流向 (Item Data) ​

n8n 节点之间传递的数据是 JSON 对象数组。

  • 每个输入项都会触发节点执行一次(除非节点明确处理所有项)。
  • 调试技巧:在编辑器中,可以点击节点执行结果的 "JSON" 视图查看具体数据结构。

4. 实战教程:从数据库导出数据并发送邮件 ​

场景:每周一早上从 Postgres 数据库查询上周销售额,生成 Excel 表格并通过邮件发送给老板。

步骤 1: 创建 Trigger ​

  1. 添加 Schedule (Cron) 节点。
  2. 设置 Trigger Interval 为 Weeks,Mode 为 Every Week,时间设为 Monday 09:00。

步骤 2: 查询数据 ​

  1. 添加 Postgres 节点。

  2. 配置 Credentials(新建数据库连接)。

  3. Operation 选择 Execute Query。

  4. Query 内容:

    sql
    SELECT product_name, amount, created_at 
    FROM sales 
    WHERE created_at > NOW() - INTERVAL '7 days'

步骤 3: 格式转换 ​

  1. 添加 Spreadsheet File 节点。
  2. Operation 选择 Create。
  3. File Format 选择 XLSX。
  4. Binary Property 填 data(这是生成的二进制文件在内存中的变量名)。

步骤 4: 发送邮件 ​

  1. 添加 Email (SMTP) 节点。
  2. 配置 SMTP 服务器(如 Gmail 或企业邮箱)。
  3. 填写 From, To, Subject。
  4. 在 Attachments 字段填入上一步定义的 Binary Property 名 (data)。

5. 进阶技巧:表达式与代码 ​

5.1 使用表达式 (Expressions) v-pre ​

在任何输入框右侧点击齿轮图标 -> Add Expression,可以引用上游数据。

  • 引用上一个节点的输出:{{ $json["field_name"] }}
  • 引用特定节点的数据:{{ $('NodeName').item.json["field_name"] }}

5.2 Code 节点 (JavaScript) ​

当内置节点无法满足需求时,使用 Code 节点处理复杂逻辑。

javascript
// 示例:对数据进行过滤和格式化
const items = $input.all();
const result = [];

for (const item of items) {
  if (item.json.status === 'active') {
    result.push({
      json: {
        id: item.json.id,
        name: item.json.name.toUpperCase(),
        timestamp: new Date().toISOString()
      }
    });
  }
}

return result;

5.3 常用表达式速查表 (Cheat Sheet) ​

  • 日期格式化 (使用 Luxon 库):
    • {{ $now.toFormat('yyyy-MM-dd') }} -> 2023-10-01
    • {{ $today.minus({ days: 1 }).toFormat('yyyy-MM-dd') }} -> 昨天
  • 字符串处理:
    • {{ $json["name"].split(' ')[0] }} -> 获取名字
    • {{ $json["email"].toLowerCase().trim() }} -> 清洗邮箱
  • 逻辑判断:
    • {{ $json["age"] > 18 ? 'Adult' : 'Minor' }}

5.4 错误处理 (Error Handling) ​

生产环境工作流必须考虑容错。

  1. Continue On Fail:
    • 在节点设置 (Settings) 中勾选 Continue On Fail。即使节点报错,流程也会继续,错误信息会输出到 error 属性中。
  2. Error Trigger:
    • 创建一个单独的 Workflow,以 Error Trigger 节点开始。
    • 当任何 其他 工作流失败时,会自动触发此工作流。
    • 用途:发送报警通知 (Slack/Email) 给管理员,包含具体的报错信息和 Workflow ID。

6. 常见问题与维护 ​

6.1 时区问题 ​

如果发现 Cron 触发时间不对,检查 Docker 环境变量 GENERIC_TIMEZONE 是否设置为 Asia/Shanghai。 同时检查 n8n 界面左下角 Settings -> Personal 中的时区设置。

6.2 无法连接本地服务 ​

在 Docker 容器中,localhost 指向容器内部。若要访问宿主机服务(如本地 MySQL),请使用 host.docker.internal(Windows/Mac)或宿主机局域网 IP。

  • Linux 用户注意:需在 docker-compose.yml 中添加 extra_hosts 配置。

    yaml
    extra_hosts:
      - "host.docker.internal:host-gateway"

6.3 内存溢出 (OOM) ​

如果处理大量数据(如一次性读取 10万行 Excel),n8n 可能会崩溃。

  • 优化:使用 SplitInBatches 节点分批处理。

  • 配置:增加 Node.js 内存限制。

    yaml
    environment:
      - NODE_OPTIONS=--max-old-space-size=4096

6.4 备份与升级 ​

  • 数据备份:n8n 的所有流程和凭证存储在 SQLite 数据库中(默认位于 ~/.n8n/database.sqlite)。只需备份挂载的 n8n_data 目录即可。

  • 版本升级:

    bash
    docker-compose pull
    docker-compose up -d

参考资料 ​

方舟 · Ark