目录

n8n:开源工作流自动化平台指南

目录

学习目标

读完本文后,你应当能够:

  1. 说清 n8n 与 Zapier、Make 在数据流向、代码扩展、AI 集成上的三处工程差异,并据此判断自己的场景该选哪一类平台。
  2. 画出 n8n 的五层系统地图(触发器、节点、凭证、执行引擎、持久化),解释 item 数组模型为什么是批量语义的默认行为。
  3. 用 Docker 单机部署跑通一个非关键工作流,正确配置 WEBHOOK_URLN8N_ENCRYPTION_KEY 和 HTTPS,并避开三个常见踩坑点。
  4. 判断什么场景该用原生集成节点、什么场景该用 HTTP Request、什么场景才值得投入写自定义节点,并给出采用顺序。
  5. 为 AI Agent 工作流设计显式的错误处理与超时策略,避免工具失败导致 LLM 幻觉或 Webhook 超时。

阅读建议:先看「n8n 的系统地图」建立整体认知,再按「快速上手」跑通一个 Docker 部署,最后根据「采用顺序与决策建议」对照自己的场景取舍。已经熟悉 n8n 的读者可以直接跳到「排查与运维」和「进阶路径」。

导航:下一节:n8n 在企业场景里靠什么站住脚


n8n 在企业场景里靠什么站住脚

把 n8n 放到 Zapier、Make(原 Integromat)旁边比较时,“400+ 集成"这个数字并不构成护城河——Zapier 的应用数量更多,Make 的可视化编排更顺。n8n 在企业场景里能站住脚,靠的是代码扩展、自托管、AI LangChain 原生集成这三者同时具备。

这三者组合起来,直接影响采购决策:当工作流需要处理客户数据、内部知识库或受合规约束的凭证时,Zapier 和 Make 的云端模型会让数据必须经过第三方 SaaS,而 n8n 自托管可以把数据流限制在企业网络内;工作流逻辑复杂到无代码表达式无法表达时,n8n 的 Code 节点允许直接写 JavaScript 或 Python,并安装 npm 包;而工作流的核心是 LLM 调用而非传统 API 编排时,n8n 内置的 LangChain 节点把 Agent、Tool、Memory、Vector Store 做成了一等公民,而不是通过 HTTP Request 节点拼装。

代价是运维投入:n8n 自托管意味着要自己管 Docker、PostgreSQL、Redis、备份和升级。Sustainable Use License 也不是纯 OSS——它允许内部和商业使用,但禁止把 n8n 本身打包成 SaaS 转售,这与 MIT/Apache 的许可范围有明确差异,采购前需要法务确认。

适合正在评估工作流平台的工程师和架构师。

导航:← 学习目标 | n8n 的系统地图


n8n 的系统地图

n8n 的核心可以拆成五层,理解这五层的边界比记住 400+ 集成更重要:

┌─────────────────────────────────────────────────────────┐
│  触发器层  Webhook / Schedule / Email / Manual / Form   │
│           / 第三方应用事件(GitHub、Slack、Shopify…)   │
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│  节点层    集成节点(OpenAI、PostgreSQL、Slack…)        │
│           Code 节点(JS / Python + npm 包)              │
│           AI 节点(LangChain Agent / Tool / Memory)     │
│           逻辑节点(IF / Switch / Merge / Loop)         │
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│  凭证层    独立于节点存储,加密保存                      │
│           支持 OAuth2、API Key、Basic Auth、JWT 等       │
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│  执行引擎  编排节点顺序、传递 item 数组、错误重试        │
│           支持子工作流、并发控制、超时                   │
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│  持久化层  工作流定义、执行历史、凭证密文                │
│           SQLite(默认)/ PostgreSQL / MySQL             │
└─────────────────────────────────────────────────────────┘

凭证独立于节点存储。一个 Slack 凭证可以被任意多个 Slack 节点引用,轮换 Token 时只改一处。这和直接在节点里写 API Key 的做法相比,安全性高一个量级——后者在节点配置里到处散落密钥,轮换一次得改几十处。

Code 节点补的是集成节点的空白。集成节点处理"调用某个 API 的标准姿势”,Code 节点处理"集成节点覆盖不到的转换逻辑"。能用集成节点就别写 Code,因为集成节点的字段映射、分页、重试已经处理好,自己写 Code 等于把这些都重造一遍。

AI 节点和普通节点走的是同一套执行引擎。LangChain Agent 节点是一个会多次回调工具节点的特殊节点,它的执行历史、错误处理、数据流转和普通节点一致,因此可以用同一套调试和监控手段管理 AI 工作流。

触发器决定工作流的执行模型。Webhook 触发器是同步的,调用方等待结果;Schedule 触发器是异步批处理;第三方应用事件触发器(如 GitHub Webhook、Slack Event)依赖 n8n 实例的公网可达性。选错触发器类型是新手最常见的坑。

导航:← n8n 在企业场景里靠什么站住脚 | 与 Zapier、Make 的工程取舍


与 Zapier、Make 的工程取舍

把三个平台放在一起时,差异不在功能数量,而在数据流向和扩展模型:

维度n8nZapierMake
部署模型自托管或 n8n Cloud仅云端仅云端
数据流向可限制在企业网络内必须经过 Zapier 云必须经过 Make 云
代码扩展Code 节点支持 JS/Python + npm仅表达式有限的表达式和模块
AI 集成LangChain 节点原生通过 OpenAI 应用通过 HTTP 和模块组合
计费模型自托管免费 / Cloud 按执行按任务数按操作数
凭证管理独立加密存储平台托管平台托管
运维成本自托管需投入零运维零运维

Zapier 和 Make 的零运维对小团队是实打实的好处——如果工作流只有十几条、数据不敏感、预算允许按量付费,云端方案的上线速度远快于自托管。n8n 的优势在另一端:工作流数量上百、数据受合规约束、需要写复杂转换逻辑、需要把 LLM 编排进流程——这些场景下自托管的控制权和代码扩展能力才用得上。

计费模型也值得拆开看。Zapier 按任务数收费,Make 按操作数收费,两者都会在工作流规模放大时出现成本不可控。n8n 自托管的成本是固定的服务器费用,但需要把运维人力算进去。一个常见的误判是只看 SaaS 的标价,忽略自托管的隐性人力成本。

导航:← n8n 的系统地图 | 快速上手:从 npx 到 Docker


快速上手:从 npx 到 Docker

n8n 的安装方式按"测试 → 单机生产 → 集群"递进,选哪种取决于用途而非偏好。

测试用途:npx 一行启动

# 需要 Node.js
npx n8n

适合本地试一下编辑器和节点配置,数据存在 ~/.n8n,不要用于生产。

单机生产:Docker

# 创建持久化卷
docker volume create n8n_data

# 启动容器
docker run -it --rm \
  --name n8n \
  -p 5678:5678 \
  -v n8n_data:/home/node/.n8n \
  docker.n8n.io/n8nio/n8n

# 访问编辑器
# http://localhost:5678

-it --rm 适合临时跑,生产环境改成 -d 并配合 restart: unless-stoppedn8n_data 卷里存着工作流定义、执行历史和加密凭证,丢了不可恢复,必须备份。

单机生产:Docker Compose

version: '3'
services:
  n8n:
    image: docker.n8n.io/n8nio/n8n
    ports:
      - "5678:5678"
    volumes:
      - n8n_data:/home/node/.n8n
    environment:
      - N8N_SECURE_COOKIE=false
    restart: unless-stopped
volumes:
  n8n_data:

N8N_SECURE_COOKIE=false 只适合本地调试,生产环境必须配合 HTTPS 改成 true

从源码构建

# 克隆仓库
git clone https://github.com/n8n-io/n8n.git
cd n8n

# 安装依赖
pnpm install

# 构建
pnpm build

# 启动
pnpm start

只有需要改 n8n 本身或调试自定义节点时才走这条路。日常使用没必要从源码构建。

导航:← 与 Zapier、Make 的工程取舍 | 工作流的核心抽象


工作流的核心抽象

节点(Node)

节点是工作流的最小执行单元。每个节点接收一个 item 数组,处理后输出一个 item 数组。item 是 n8n 的数据载体,结构是 { json: {...}, binary?: {...} }。理解 item 数组这个模型很关键——它决定了节点之间如何传递数据,也决定了批量处理时的行为。

n8n 选择 item 数组而不是单个对象,是因为工作流自动化的典型场景就是批量处理:一次 Webhook 可能带 10 条订单,一次数据库查询可能返回 100 行。如果节点只处理单个对象,用户就得自己在每个节点里写循环逻辑。item 数组让批量语义成为默认行为,节点内部不用写 for 循环。

一个常见误区是把节点当成函数。节点更接近 map 操作:如果输入是 10 个 item,节点会对每个 item 执行一次,输出 10 个 item。Code 节点里写 return [transformed] 只会输出 1 个 item,要保留批量语义应该写 return items.map(...)

触发器(Trigger)

触发器决定工作流何时启动。几类触发器的执行语义不同:

  • Webhook:同步,调用方等待 n8n 返回。适合做 API 代理或即时响应。
  • Schedule:异步,按 cron 表达式触发。适合批处理。
  • Email:异步,IMAP 轮询新邮件。适合邮件驱动的流程。
  • Manual:只在编辑器里手动点击执行。用于调试。
  • Form:n8n 自带的表单页面提交触发。适合内部工具。
  • 第三方应用事件:依赖 Webhook URL 公网可达,配置时要把 WEBHOOK_URL 设对。

WEBHOOK_URL 配错是第三方触发器不工作的最常见原因。n8n 在向 GitHub、Slack 等平台注册 Webhook 时会用这个值,如果设成 localhost,平台回调时根本到不了你的实例。

凭证(Credential)

凭证独立于节点存储,加密保存在数据库里。解耦带来的直接收益是复用:同一个凭证可以被多个节点复用(一个 Slack Token 能被几十个 Slack 节点引用),轮换凭证时只改一处,凭证的加密和权限管理可以单独做,不和具体节点的配置混在一起。

加密密钥由 N8N_ENCRYPTION_KEY 控制,默认自动生成并存在 ~/.n8n/config。生产环境必须显式设置这个环境变量,否则密钥丢失后所有凭证不可解密。

凭证支持 OAuth2、API Key、Basic Auth、JWT 等常见类型。OAuth2 凭证会自动处理 Token 刷新,不需要在节点里手动管理过期。

导航:← 快速上手:从 npx 到 Docker | 一次 AI Agent 工作流的完整路径


一次 AI Agent 工作流的完整路径

分层图是静态的,光看图记不住执行引擎怎么工作。用一个 AI 客服工作流把节点、触发器、凭证、执行引擎串起来,看一次任务实际怎么流过 n8n。

场景

客户在网站提交问题,n8n 接收后用 LLM 判断是否需要人工,需要则创建工单并通知 Slack,不需要则直接回复。

工作流结构

[Webhook 触发]
    │  接收 POST /ask,body 含 question 和 user_id
[LangChain Agent 节点]
    │  系统提示词:判断问题类型,决定调用哪些工具
    │  绑定工具:知识库检索、工单查询、工单创建
[工具节点分支]
    ├── [Vector Store 检索]
    │     从 Pinecone 检索相关文档片段
    ├── [PostgreSQL 工单查询]
    │     查询该用户最近的工单状态
    └── [PostgreSQL 工单创建]
          当 Agent 判断需要人工时调用
[LangChain Agent 节点(继续)]
    │  汇总工具返回结果,生成最终回复
[IF 节点]
    │  判断回复中是否包含 "需要人工" 标记
    ├── 是 → [Slack 通知] → [Webhook Response 返回工单号]
    └── 否 → [Webhook Response 返回回复]

一次执行的内部流转

  1. Webhook 触发器收到 HTTP 请求,把 questionuser_id 包成 item 传给下游。
  2. LangChain Agent 节点接收 item,把 question 作为用户消息发给 LLM。LLM 根据 system prompt 决定调用工具。
  3. 假设 LLM 决定先检索知识库:Agent 节点暂停,调用 Vector Store 检索节点,传入查询词。检索节点返回 top-3 文档片段给 Agent。
  4. Agent 把片段塞进上下文,再次调用 LLM。LLM 判断信息不足,决定再查工单历史。Agent 调用 PostgreSQL 工单查询节点。
  5. 工单查询节点用预存的 PostgreSQL 凭证连接数据库,执行参数化查询,返回该用户最近 3 条工单。
  6. Agent 把所有上下文交给 LLM 生成最终回复。回复里包含 “需要人工:是” 标记。
  7. IF 节点解析回复,走 “是” 分支。
  8. Slack 通知节点用 Slack 凭证发消息到 #support 频道,附带问题、用户 ID、Agent 的分析。
  9. Webhook Response 节点返回工单号给调用方。
  10. 整个执行过程被写入执行历史,包含每个节点的输入输出、耗时、状态。

从这个案例能看到的几件事

Agent 节点会多次回调工具节点。Agent 节点在内部循环:调用工具 → 拿到结果 → 再问 LLM → 决定是否继续调用。执行历史里会看到工具节点被多次执行,这是正常行为,不是重试。

凭证在多个节点间共享是这个工作流的关键设计。PostgreSQL 凭证被工单查询和工单创建两个节点引用,Slack 凭证被通知节点引用。轮换数据库密码时只改一处,所有引用该凭证的节点自动生效。

错误处理需要显式设计。如果 Vector Store 检索失败,Agent 会拿到错误信息继续推理,可能产生幻觉。生产环境应该在工具节点里加 try-catch,返回结构化错误给 Agent,而不是让 LLM 自己猜。

还有一点容易忽略:Webhook 触发器有超时限制。LLM 调用 + 工具调用可能超过 30 秒,HTTP 客户端会超时。长任务应该改成异步——Webhook 立即返回 “处理中”,后台工作流完成后通过另一个 Webhook 或 Slack 通知。

导航:← 工作流的核心抽象 | 400+ 集成背后的工程取舍


400+ 集成背后的工程取舍

n8n 的集成不是单一形态,理解三种集成方式的差异比数集成数量重要:

原生集成节点:n8n 官方维护的节点,如 OpenAI、Slack、PostgreSQL、GitHub。字段映射、分页、错误处理已经处理好,能用就用。

HTTP Request 节点:通用 HTTP 客户端,可以调用任何 REST API。适合原生节点没覆盖的服务,或需要精细控制请求的场景。配合 Define OAuth2 API 凭证类型,可以给任意 API 加 OAuth2 支持。

自定义节点:用 TypeScript 写的节点包,发布到 npm。适合内部系统或高频使用的第三方服务。开发成本高于前两者,但复用性最好。

OpenAI 集成示例

// OpenAI ChatGPT 节点配置
{
  "resource": "chat",
  "operation": "complete",
  "model": "gpt-4",
  "messages": [
    {
      "role": "user",
      "content": "解释这段代码的功能"
    }
  ],
  "temperature": 0.7,
  "maxTokens": 500
}

实际配置时优先用 n8n 编辑器的可视化字段,JSON 形态主要用于版本管理和模板导出。temperaturemaxTokens 的取值要根据场景调,客服场景建议 temperature 设 0.3 以下以减少随机性。

Slack 集成示例

// Slack 发送消息节点配置
{
  "resource": "message",
  "operation": "post",
  "channel": "#general",
  "text": "工作流执行完成!\n状态:成功\n时间:{{ $now }}",
  "username": "n8n Bot"
}

{{ $now }} 是 n8n 的表达式语法,运行时求值。表达式可以引用上游节点的输出,比如 {{ $json["workflow_name"] }}

数据库集成示例

// PostgreSQL 查询节点
{
  "operation": "execute",
  "query": "SELECT * FROM users WHERE created_at > $1",
  "values": ["{{ $json.since }}"]
}

参数化查询是硬性要求。直接拼字符串会导致 SQL 注入,n8n 的 PostgreSQL 节点支持 $1$2 占位符,配合 values 数组传参。

集成分类速查

分类代表集成
AI & MLOpenAI、Anthropic Claude、LangChain、Hugging Face
通信Slack、Discord、Teams、Email
云服务AWS、Google Cloud、Azure
数据库PostgreSQL、MySQL、MongoDB、Redis
CRMSalesforce、HubSpot
电商Shopify、WooCommerce、Stripe
社交Twitter/X、LinkedIn、Instagram
开发GitHub、GitLab、Jira

这个表只用于快速定位。具体某个服务是否支持某个操作,查 n8n 集成中心 比记表格靠谱。

导航:← 一次 AI Agent 工作流的完整路径 | 自托管部署的真实考量


自托管部署的真实考量

为什么自托管对企业重要

自托管把数据流限制在企业控制的边界内。Zapier 和 Make 的工作流执行时,数据会经过它们的云端服务器——这对个人或小团队无伤大雅,但对处理客户 PII、内部财务数据、医疗记录的企业,可能直接违反 GDPR、HIPAA 或行业合规要求。n8n 自托管后,数据流可以完全在内网完成,只有需要调用外部 API 时才出境。

数据流收窄之后,凭证也跟着落到企业自己的加密存储里——云端方案下所有 API Key、OAuth Token 都存在 SaaS 平台侧,平台被攻破意味着所有凭证泄露,自托管把攻击面收窄到企业自己的基础设施。

成本方面:SaaS 按执行或操作收费,工作流规模放大后成本会非线性增长,自托管的成本是固定的服务器和运维人力,规模越大单位成本越低。

但运维投入省不掉:备份、升级、监控、安全补丁都要自己做。如果团队没有专职运维,自托管的隐性成本可能超过 SaaS 的显性成本。

Docker 部署

基础部署

docker run -d \
  --name n8n \
  -p 5678:5678 \
  -v n8n_data:/home/node/.n8n \
  -e N8N_HOST=your-domain.com \
  -e N8N_PROTOCOL=https \
  -e WEBHOOK_URL=https://your-domain.com/ \
  docker.n8n.io/n8nio/n8n

WEBHOOK_URL 必须设成外部可访问的地址,否则第三方 Webhook 注册会失败。

使用代理

docker run -d \
  --name n8n \
  -p 5678:5678 \
  -v n8n_data:/home/node/.n8n \
  -e HTTP_PROXY=http://proxy:8080 \
  -e HTTPS_PROXY=http://proxy:8080 \
  docker.n8n.io/n8nio/n8n

企业内网通常需要走代理才能访问外部 API。注意 n8n 调用 OpenAI、Slack 等 SaaS 时会走这个代理,但调用内网服务时不应该走——需要配合 NO_PROXY 环境变量排除内网域名。

关键环境变量

变量说明默认值
N8N_HOST主机名localhost
N8N_PORT端口5678
N8N_PROTOCOL协议http
WEBHOOK_URLWebhook 基础 URL-
N8N_BASIC_AUTH_ACTIVE启用 Basic Authfalse
N8N_BASIC_AUTH_USERBasic Auth 用户名-
N8N_BASIC_AUTH_PASSWORDBasic Auth 密码-
N8N_ENCRYPTION_KEY加密密钥自动生成
EXECUTIONS_DATA_SAVE_ON_ERROR错误时保存数据all
EXECUTIONS_DATA_SAVE_ON_SUCCESS成功时保存数据all

N8N_ENCRYPTION_KEY 在生产环境必须显式设置并妥善保管。丢失后所有凭证不可解密,等于工作流全部失效。EXECUTIONS_DATA_SAVE_ON_SUCCESS 在高频工作流下建议改成 none 或自定义 prune,否则执行历史会无限增长撑爆数据库。

数据持久化

# 创建命名卷
docker volume create n8n_data

# 查看卷位置
docker volume inspect n8n_data

默认用 SQLite,数据存在 n8n_data 卷里。生产环境建议改用 PostgreSQL,性能和并发能力都更好。切换数据库时执行历史不会自动迁移,需要导出工作流定义后在新数据库重新导入。

HTTPS 配置

生产环境必须 HTTPS。用 Traefik 做反向代理和自动证书:

# docker-compose.yml
services:
  traefik:
    image: traefik:v2.10
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.yml:/traefik.yml
      - ./certs:/certs

  n8n:
    image: docker.n8n.io/n8nio/n8n
    environment:
      - N8N_HOST=n8n.example.com
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.example.com/
    labels:
      - traefik.enable=true
      - traefik.http.routers.n8n.rule=Host(`n8n.example.com`)
      - traefik.http.routers.n8n.tls.certresolver=letsencrypt

N8N_SECURE_COOKIE 在 HTTPS 下必须设回 true,否则 Cookie 可能在中间节点被截获。

导航:← 400+ 集成背后的工程取舍 | 企业级功能:什么时候需要


企业级功能:什么时候需要

n8n 的企业级功能按需开启,单团队用不上就别开。

权限管理

角色权限
Owner完全控制
Admin管理用户和工作流
Member编辑自己的工作流
Editor仅编辑
Viewer仅查看

角色系统在多团队共用一个 n8n 实例时才有价值。单团队使用时全员 Admin 反而更顺手,权限分层带来的管理成本可能超过收益。

项目隔离:按项目分组工作流,独立权限控制,跨项目模板共享。适合多业务线共用平台的中大型组织。

SSO 配置

以 n8n 1.x 版本为例,支持 SAML 2.0、OIDC(OpenID Connect)、LDAP/Active Directory。企业已有身份提供商时强制走 SSO,避免本地账号泄露后横向移动。

OIDC 配置示例(通过环境变量注入):

以下环境变量名以 n8n 1.x 为例,不同版本可能有差异,使用前请核对官方文档。

# 环境变量(生产环境通过密钥管理服务注入,不要写进 docker-compose.yml)
N8N_SSO_ENABLED=true
N8N_SSO_PROVIDER=oidc
N8N_SSO_CLIENT_ID=your-client-id
N8N_SSO_CLIENT_SECRET=your-client-secret
N8N_SSO_ISSUER_URL=https://your-idp.com

N8N_SSO_CLIENT_SECRET 必须通过环境变量或密钥管理服务注入,不要写进 docker-compose.yml 提交到 Git。SSO 相关环境变量名在不同 n8n 版本间有调整,部署前以 n8n 官方环境变量文档 为准。

空中隔离部署

n8n 支持 Air-Gapped 环境部署:无需互联网连接,完全离线运行,企业内部数据安全。代价是无法用 n8n Cloud 的模板同步、无法自动更新节点定义。适合金融、军工、能源等强隔离行业。

审计日志

用户操作记录、工作流执行历史、敏感操作告警。审计日志建议导出到外部 SIEM(如 ELK、Splunk),n8n 自身的日志存储不适合长期合规留存。

导航:← 自托管部署的真实考量 | 自定义节点开发:何时该写、何时不该写


自定义节点开发:何时该写、何时不该写

写自定义节点之前先问三个问题:

  1. HTTP Request 节点能不能解决?能就别写。
  2. 是不是高频复用的内部系统?是才值得写。
  3. 团队有没有维护 npm 包的能力?没有就先用 HTTP Request 顶着。

自定义节点的好处是把内部系统的 API 调用标准化,让非开发同事也能在编辑器里拖拽使用。如果只是某个工作流用一次,HTTP Request 节点更合适。

创建自定义节点

# 使用 n8n 节点开发工具
npx n8n-node-dev

# 选择基础模板
? Select a template for your new node
  ❯ Empty Node
    CredentialType
    Template

节点结构

my-custom-node/
├── src
│   └── nodes
│       └── MyCustomNode
│           ├── MyCustomNode.node.ts
│           └── MyCustomNode.trigger.ts
├── credentials
│   └── MyCustomApi.credentials.ts
├── package.json
└── README.md

凭证和节点分开存放是有意设计:一个凭证类型可以被多个节点复用,比如内部 API 网关的 Token 可能被十几个内部服务节点共用。

节点代码示例

import { INodeType, INodeTypeDescription } from 'n8n-workflow';

export class MyCustomNode implements INodeType {
  description: INodeTypeDescription = {
    displayName: 'My Custom Node',
    name: 'myCustomNode',
    icon: 'fa:rocket',
    group: ['transform'],
    version: 1,
    description: 'A custom node I built',
    defaults: {
      name: 'My Custom Node',
    },
    inputs: ['main'],
    outputs: ['main'],
    properties: [
      {
        displayName: 'API Key',
        name: 'apiKey',
        type: 'string',
        default: '',
      },
      {
        displayName: 'Operation',
        name: 'operation',
        type: 'options',
        options: [
          { name: 'Get', value: 'get' },
          { name: 'Post', value: 'post' },
        ],
        default: 'get',
      },
    ],
  };

  async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
    const items = this.getInputData();
    const returnData: INodeExecutionData[] = [];

    for (let i = 0; i < items.length; i++) {
      const apiKey = this.getNodeParameter('apiKey', i) as string;
      const operation = this.getNodeParameter('operation', i) as string;

      // 执行操作
      const result = { operation, timestamp: new Date().toISOString() };
      returnData.push({ json: result });
    }

    return [returnData];
  }
}

execute 方法里的 for 循环是 n8n 节点的标准模式:对每个输入 item 执行一次操作,保持批量语义。如果只处理第一个 item,会丢失批量数据。

发布节点

# 构建
pnpm build

# 登录 npm
npm login

# 发布到 npm
npm publish --access public

发布前在 package.json 里加 n8n 字段声明节点入口,否则 n8n 识别不到。内部节点可以发到私有 npm registry,不必公开。

导航:← 企业级功能:什么时候需要 | 实战场景与适用边界


实战场景与适用边界

AI 客服机器人

[Webhook 触发] 
  → [LangChain Agent] 
    → [Tool: Slack] 
    → [Tool: 数据库查询]

适合:知识库相对稳定、问题类型可枚举的客服场景。

不适合:需要多轮深度对话、需要情感判断的高敏感场景——这类场景用专门的对话框架(如 Rasa)更合适,n8n 做后端编排。

数据同步管道

[Schedule 触发]
  → [PostgreSQL 查询]
  → [数据转换]
  → [Elasticsearch 索引]
  → [发送 Slack 通知]

适合:定时全量或增量同步、ETL 轻量场景。

不适合:实时 CDC(变更数据捕获)、超大规模数据(千万级以上)——前者用 Debezium + Kafka,后者用 Spark 或 Flink。

社交媒体管理

[RSS 触发]
  → [内容提取]
  → [AI 生成摘要]
  → [多平台发布]
    → Twitter
    → LinkedIn
    → Facebook

适合:内容运营团队的发布自动化。

不适合:需要严格审核流程的场景——AI 生成内容直接发布有合规风险,应该加人工审核节点。

电商订单处理

[Shopify 新订单]
  → [验证库存]
  → [创建发货单]
  → [发送邮件通知]
  → [更新 CRM]

适合:中小电商的订单流转自动化。

不适合:高频交易、强一致性要求的场景——n8n 的工作流不是事务性的,中间节点失败不会自动回滚上游操作,需要显式设计补偿逻辑。

导航:← 自定义节点开发:何时该写、何时不该写 | 排查与运维


排查与运维

调试工作流

  1. 用 Manual 触发器逐步测试,不要直接用 Webhook 触发器调试。
  2. 在每个节点后加 Code 节点打印 JSON.stringify($input.all(), null, 2),看实际数据结构。
  3. 用编辑器的 “Preview” 模式查看每个节点的输入输出,比看执行日志直观。
  4. 执行历史里点开失败节点,看错误堆栈和当时的输入数据——大多数错误是数据结构不匹配,不是节点本身的问题。

处理大文件

  • 用流式处理(Streaming),不要把整个文件读进内存。
  • 配置节点超时时间(在节点设置的 Timeout 字段里),避免长任务卡死执行引擎。
  • 用 “Chunk” 或 “Loop” 节点分批处理,每批控制在几百条。

错误处理与重试

n8n 的错误处理有三种模式:

  • 节点级重试:在节点设置里开启 retry,配置间隔和次数。适合网络抖动类错误。
  • 错误触发器:用 Error Trigger 节点捕获工作流错误,转发到告警工作流。适合集中监控。
  • Try-Catch 模式:用 Execute Workflow 节点调用子工作流,子工作流失败时走补偿逻辑。适合需要事务性的场景。
// 错误告警工作流
const error = $json.error;
const workflowName = $workflow.name;

if (error) {
  return [{
    json: {
      alert: 'Workflow Failed',
      workflow: workflowName,
      error: error.message,
      time: new Date().toISOString()
    }
  }];
}

常见问题速查

症状排查方向解决办法
第三方 Webhook 不触发WEBHOOK_URL 配成 localhost 或内网地址改成外部可访问的 HTTPS 地址,重启 n8n
凭证全部失效N8N_ENCRYPTION_KEY 丢失或被重置从备份恢复原密钥;无法恢复则需重新录入所有凭证
执行历史撑爆磁盘EXECUTIONS_DATA_SAVE_ON_SUCCESS=all 且无 prune改成 none 或配置 prune 策略,定期清理旧记录
工作流执行到一半卡住节点超时未配置,长任务阻塞执行引擎在节点设置里配 Timeout,长任务改异步子工作流
Code 节点只输出 1 条写了 return [transformed] 而非 return items.map(...)改成 map 写法保留批量语义
升级后工作流行为异常用了 latest 标签,大版本有不兼容变更锁定具体版本号,先在测试环境验证再上生产
多副本下 Webhook 重复执行Webhook 触发器未做幂等在业务层用唯一 ID 去重,或用 EXECUTIONS_MODE=queue 配合 Redis 分发

进阶 Q&A

速查表覆盖的是单点症状。生产环境里更常见的是复合问题,挑四个展开说。

Q1:工作流在生产环境偶发失败,但本地用 Manual 触发器跑完全正常,怎么定位?

本地跑通不代表生产没问题,两者的差异通常在触发器和数据上。先按这个顺序排查:

  1. 看执行历史里失败那次的输入数据。生产环境的真实数据往往比测试数据大几个量级,item 数组可能有几百上千条,某个字段的 null 或类型变化都会让节点炸掉。
  2. 检查触发器类型。Webhook 触发器是同步的,如果下游节点耗时超过 HTTP 客户端超时(通常 30 秒),调用方会断开,但 n8n 这边的工作流还在跑——表现为"调用方说失败,执行历史显示成功"。长任务改成异步,参考一次 AI Agent 工作流的完整路径末尾的超时处理。
  3. 看监控的执行成功率趋势。如果是某天突然下降,多半是上游 API 变更或凭证过期,不是工作流本身的问题。

Q2:工作流处理大批量数据时越来越慢,瓶颈在哪?

先确认慢在哪一层,再动手。常见的三个瓶颈:

  • item 数组全量加载。如果 PostgreSQL 查询返回几万行,n8n 会把所有 item 放进内存,节点之间的传递也是全量拷贝。改用分页查询或 Limit 节点先截断,处理完一批再查下一批。
  • Code 节点里写了同步循环。Code 节点对每个 item 执行一次,如果循环里有 HTTP 调用,N 个 item 就是 N 次串行请求。改成批量 API 或用 Promise.all 并发。
  • 执行历史写入拖慢EXECUTIONS_DATA_SAVE_ON_SUCCESS=all 在高频工作流下会让数据库写入成为瓶颈,参考自托管部署的关键环境变量一节,改成 none 或配 prune。

如果数据量到千万级,n8n 不是合适的工具,参考实战场景与适用边界里数据同步管道的适用边界,换 Spark 或 Flink。

Q3:从 SQLite 迁移到 PostgreSQL,执行历史和凭证会一起迁过去吗?

不会自动迁移。n8n 的数据库切换只迁移工作流定义和凭证,执行历史留在原库里。正确做法:

  1. 在新 PostgreSQL 实例上启动 n8n,让它自动建表。
  2. 从旧 SQLite 实例导出工作流定义(编辑器里 Export 或调 /api/v1/workflows/export)。
  3. 在新实例导入工作流,重新录入凭证——N8N_ENCRYPTION_KEY 不同的话,旧密文解不开,必须重录。
  4. 如果执行历史有合规留存需求,单独用 sqlite3 导出成 CSV 存档,不要指望 n8n 帮你迁。

凭证重录这件事容易踩坑:很多人以为换个数据库密钥也能跟着迁,结果上线时所有工作流报错。参考工作流的核心抽象里凭证一节,加密密钥和凭证是绑定的。

Q4:AI Agent 工作流里工具节点偶尔失败,LLM 拿到错误后开始编造结果,怎么处理?

这是 AI 工作流最典型的幻觉来源。工具失败时,n8n 默认把错误信息塞回给 Agent,LLM 会尝试"理解"这个错误并继续回答,结果往往是编造一个看起来合理但不存在的结果。处理方式:

  1. 在工具节点里包 try-catch,失败时返回结构化错误对象(如 { error: true, message: "检索服务不可用", retryable: true }),而不是让原始错误字符串直接进 LLM 上下文。
  2. 在 Agent 的 system prompt 里明确约定:收到 error: true 的工具返回时,必须告知用户"该功能暂时不可用",不要猜测答案。
  3. 对关键工具加节点级重试(参考排查与运维的错误处理与重试一节),网络抖动类错误重试两三次往往就过了。
  4. 用 Error Trigger 节点把工具失败事件转发到告警工作流,让人知道有工具在出问题,而不是等用户投诉。

这套设计在一次 AI Agent 工作流的完整路径的"错误处理需要显式设计"部分有提到,生产环境必须落地。

高可用部署

单机 n8n 进程退出,工作流就停。生产环境建议多副本 + Redis + PostgreSQL:

# docker-compose.yml for HA
services:
  n8n:
    image: docker.n8n.io/n8nio/n8n
    deploy:
      replicas: 3
    depends_on:
      - redis
      - postgres
  redis:
    image: redis:7-alpine
  postgres:
    image: postgres:15

多副本模式下,EXECUTIONS_MODE 要设成 queue,Webhook 触发器由 Redis 队列分发到不同副本执行。注意:定时触发器在多副本下会去重,但 Webhook 触发器需要外部负载均衡保证幂等。

升级

# Docker 方式
docker pull docker.n8n.io/n8nio/n8n:latest
docker stop n8n
docker rm n8n
# 重新启动(数据保持)

升级前必须备份 n8n_data 卷和数据库。n8n 的大版本升级(如 1.x → 2.x)可能有不兼容变更,先在测试环境验证。生产环境建议锁定版本号,不要用 latest 标签。

监控

监控三个指标就够了:

  • 执行成功率:低于 95% 说明工作流有稳定性问题。n8n 自身的执行历史 API(/api/v1/executions)可以拉到每次执行的状态,配合 Prometheus 暴露成功率指标。
  • 执行耗时 P95:突然变长通常是上游 API 变慢或数据库索引缺失。关注 P95 而非平均值,长尾任务会拖垮整体体验。
  • 队列积压:多副本模式下,Redis 队列长度持续增长说明副本数不够。用 redis-cli LLEN <queue_name> 监控。

告警建议接 PagerDuty 或飞书机器人,不要只靠邮件——工作流故障往往在非工作时间发生,邮件告警的响应速度不够。

导航:← 实战场景与适用边界 | 采用顺序与决策建议


采用顺序与决策建议

谁该先用 n8n

适合先上的团队

  • 有运维能力的中大型企业,工作流涉及敏感数据,需要自托管满足合规。
  • AI 应用团队,需要把 LLM 编排进业务流程,且不想从零搭 Agent 框架。
  • 内部工具团队,需要快速搭建跨系统数据流转,且逻辑复杂到无代码表达式不够用。

可以等等的团队

  • 工作流只有几条、数据不敏感的小团队——Zapier 或 Make 上线更快,零运维。
  • 需要严格事务一致性的场景——n8n 的工作流不是事务性的,金融交易类场景不合适。
  • 需要超低延迟的场景——n8n 的执行引擎有调度开销,毫秒级响应用代码直接写更快。

落地顺序

  1. 先跑通一个非关键工作流。选一个数据不敏感、失败可接受的工作流(如每日报告推送),用 Docker 单机部署验证。这一步验证的是 Docker 部署、WEBHOOK_URL 配置、凭证加密存储是否正常工作。
  2. 再迁移一个 AI 工作流。把一个现有的 LLM 调用脚本改造成 n8n 工作流,体验 LangChain 节点的编排能力。重点看 Code 节点的 npm 包安装、LangChain Agent 节点的工具回调机制、以及 Webhook 触发器的超时限制。
  3. 然后做凭证和权限治理。把散落在各处的 API Key 收敛到 n8n 凭证系统,按团队划分项目。这一步验证的是凭证的 OAuth2 Token 刷新、项目隔离的权限模型、以及 N8N_ENCRYPTION_KEY 的备份策略。
  4. 最后做高可用和监控。工作流数量上 50 条、有核心业务依赖后,再上多副本和监控。盯三个指标:执行成功率、P95 耗时、队列积压,分别对应工作流稳定性、长尾任务和 Redis 队列健康度。

不要做的事

  • 不要把 n8n 当数据库用。工作流定义和执行历史不是业务数据,该存业务库的还是要存业务库。
  • 不要在 Code 节点里写复杂业务逻辑。Code 节点适合数据转换,复杂逻辑应该抽成独立服务,n8n 通过 HTTP Request 调用。
  • 不要忽略执行历史的增长。生产环境必须配置 prune 策略,否则磁盘会爆。
  • 不要用 latest 标签跑生产。版本漂移会导致工作流行为突然变化。

Sustainable Use License 的边界

n8n 的许可证是 Sustainable Use License,属于 fair-code 范畴,不是 OSI 认可的开源许可证。具体边界:

  • ✅ 内部使用:企业内部跑工作流,无限制。
  • ✅ 商业使用:把 n8n 集成进自己的产品提供给客户,可以。
  • ❌ 转售 n8n 本身:把 n8n 改个名字作为 SaaS 卖给别人,不行。
  • ❌ 移除许可证限制:去除 fair-code 限制后重新分发,不行。

采购前让法务确认这个许可证是否符合公司政策。部分企业对非 OSI 开源许可证有统一禁令,需要提前沟通。

官方资源

  • GitHub:https://github.com/n8n-io/n8n
  • 文档:https://docs.n8n.io
  • 集成中心:https://n8n.io/integrations
  • 模板库:https://n8n.io/workflows
  • 社区论坛:https://community.n8n.io
  • AI 指南:https://docs.n8n.io/advanced-ai/

导航:← 排查与运维 | 练习与自测


练习与自测

下面六道题用来检验你是否真的把上文消化了。建议先动手再做答,对照执行历史和官方文档验证。

动手题

  1. 触发器选型。你要做一个"客户下单后 30 分钟未付款自动发提醒"的工作流,应该选 Webhook、Schedule 还是第三方应用事件触发器?写出你的选择和理由,并说明这个工作流的执行模型是同步还是异步。

  2. item 数组语义。写一个 Code 节点,输入是 10 条订单(含 order_idamount 字段),输出每条订单的 amount 翻倍后的结果。故意写成 return [{ json: { doubled: items[0].json.amount * 2 } }],观察输出 item 数量,再改成正确的 map 写法对比。

  3. 凭证治理。在一个工作流里同时用 PostgreSQL 凭证查询用户、用 Slack 凭证发通知。手动轮换一次 PostgreSQL 密码(在凭证管理界面改),观察工作流是否需要重新配置——这验证了凭证独立存储的好处。

  4. AI 工作流的错误处理。把上文 AI 客服案例里的 Vector Store 检索节点故意配错(比如 Pinecone API Key 写错),观察 Agent 节点拿到错误后的行为。然后在工具节点里加 try-catch 返回结构化错误,对比两种情况下 LLM 的回复质量。

思考题

  1. 采用决策。你的团队有 5 条工作流、数据不敏感、没有专职运维,但其中一条工作流需要调用内部知识库做 RAG。你会选 Zapier、Make 还是 n8n?如果选 n8n,是自托管还是 n8n Cloud?给出取舍依据。

  2. 适用边界。电商订单处理场景里,“n8n 的工作流不是事务性的"这句话具体意味着什么?如果"验证库存"成功但"创建发货单"失败,会出现什么状态?你会如何设计补偿逻辑?

自测对照

  • 第 1 题考察触发器执行模型的理解,关键在"30 分钟未付款"这个条件需要轮询或延迟,不是事件驱动。
  • 第 2 题考察 item 数组的 map 语义,错误写法会丢 9 条数据。
  • 第 3 题验证凭证独立存储的实际收益。
  • 第 4 题考察 AI 工作流的错误处理设计,幻觉往往来自工具失败后 LLM 自行猜测。
  • 第 5 题没有标准答案,关键看你是否能把数据敏感性、运维成本、AI 集成需求三个维度拆开权衡。
  • 第 6 题考察事务边界的理解,补偿逻辑可以用 Execute Workflow 调用回滚子工作流。

导航:← 采用顺序与决策建议 | 进阶路径


进阶路径

按下面四步推进,每一步都对应一个可验证的产出物:

第一步:跑通单机部署并迁移一个真实工作流

  • 产出物:一个 Docker 单机部署的 n8n 实例 + 一个从现有脚本迁移过来的工作流。
  • 验证标准:工作流连续运行 7 天无中断,执行历史可追溯,凭证加密存储可备份恢复。
  • 关键卡点:WEBHOOK_URL 配置、N8N_ENCRYPTION_KEY 备份、HTTPS 证书。

第二步:把 LLM 编排进工作流

  • 产出物:一个 LangChain Agent 工作流,至少调用 2 个工具节点。
  • 验证标准:Agent 能根据输入决定调用哪个工具,工具失败时有结构化错误返回,长任务改成异步。
  • 关键卡点:Webhook 超时限制、工具节点的 try-catch、Agent 的 system prompt 设计。

第三步:做凭证和权限治理

  • 产出物:所有 API Key 收敛到 n8n 凭证系统,按团队划分项目,SSO 接入身份提供商。
  • 验证标准:凭证轮换只改一处,跨项目无法互相编辑工作流,SSO 登录可用。
  • 关键卡点:OAuth2 Token 刷新机制、项目隔离的权限模型、SSO 环境变量名版本差异。

第四步:上高可用和监控

  • 产出物:多副本部署 + Redis 队列 + PostgreSQL + Prometheus 监控 + 告警接入。
  • 验证标准:单副本宕机不影响工作流执行,执行成功率、P95 耗时、队列积压三个指标有告警阈值。
  • 关键卡点:EXECUTIONS_MODE=queue 配置、Webhook 触发器的幂等设计、Redis 队列监控。

不建议走的路

  • 工作流数量没到 50 条就上多副本——运维成本远超收益,单机 + 备份足够。
  • 把核心业务逻辑写在 Code 节点里——Code 节点适合数据转换,复杂业务逻辑应该抽成独立服务。
  • 用 n8n 替代专业 ETL 工具做大规模数据同步——千万级以上数据用 Spark 或 Flink,n8n 的执行引擎不是为这个设计的。
  • 跳过测试环境直接上生产升级——大版本升级有不兼容变更,先在测试环境跑一遍全量工作流。

导航:← 练习与自测