欢迎来到n8n的深度学习之旅!本教程旨在为您提供一份从基础部署到企业级应用的详尽指南,助您高效掌握n8n,实现自动化工作流的无限可能。
n8n("node eight n" 的缩写)是一个强大的开源自动化工具,它允许您连接各种应用程序和服务,通过创建“工作流”(workflows)来自动化复杂的任务和流程。它被誉为“自由且可扩展的 Zapier 或 IFTTT”,因为它提供了类似的功能,但却允许您在自己的服务器上运行,拥有完全的数据控制权和更高的可定制性。
n8n 的核心功能与优势:
Code 节点编写自定义 JavaScript 逻辑,处理复杂数据或集成未内置的服务。与其他自动化工具(如 Zapier, IFTTT, Airflow)的对比:
| 特性 | n8n | Zapier/IFTTT (SaaS) | Apache Airflow |
|---|---|---|---|
| 部署方式 | 自托管 (On-premise) / 云托管 | SaaS (软件即服务) | 自托管 (通常为大数据/ETL) |
| 数据控制 | 完全控制 | 第三方托管 | 完全控制 |
| 费用 | 开源免费,企业版收费;自托管成本 | 基于任务量/功能订阅费 | 开源免费,自托管成本 |
| 可定制性 | 极高 (Code节点, 自定义节点) | 有限 (预设操作, 部分自定义脚本) | 极高 (Python代码编写DAG) |
| 适用场景 | 应用集成、API编排、业务流程自动化、数据预处理 | 轻量级任务自动化、个人效率 | 复杂数据管道、ETL、任务调度、大数据工作流 |
| 学习曲线 | 中等 (需理解JSON、HTTP、JS基础) | 低 (图形化界面,即用型) | 高 (需深入Python、调度系统知识) |
总结: n8n 介于 Zapier 的易用性和 Airflow 的强大功能之间,是需要高度定制化和数据控制权的中小型企业或开发者的理想选择。
n8n 的开源特性与社区生态:
n8n 基于 MIT 许可证,这意味着您可以免费使用、修改和分发。它拥有一个活跃的社区,您可以在其论坛、GitHub 仓库找到丰富的资源、提问并参与贡献。社区驱动的开发模式也确保了 n8n 功能的持续更新和扩展。
理解 n8n 的内部工作原理有助于您更好地设计和调试工作流。
节点执行引擎与事件驱动模型:
n8n 的核心是一个事件驱动的执行引擎。当一个工作流被触发(例如收到一个 Webhook 请求或达到一个定时器时间),它会产生一个“执行”(Execution)实例。这个实例会按照工作流中定义的路径,依次执行每个节点。每个节点接收前一个节点的输出数据(以 JSON 格式),处理后生成新的输出数据,再传递给下一个节点。
数据流转机制(JSON数据处理):
n8n 中的所有数据都以 JSON 格式在节点之间传递。每个节点接收一个包含“项”(items)的数组,每个项都包含一个 json 属性(存储实际数据)以及可选的 binary 属性(用于文件或二进制数据)。
[
{
"json": {
"name": "Alice",
"email": "[email protected]",
"orderId": "123"
},
"binary": {}
},
{
"json": {
"name": "Bob",
"email": "[email protected]",
"orderId": "456"
},
"binary": {}
}
]
在节点内部,您可以访问和操作这些JSON数据,例如使用表达式或 Code 节点来提取、转换或过滤数据。
持久化存储(SQLite/PostgreSQL/MySQL):
n8n 需要一个数据库来存储工作流定义、凭据、执行日志以及内部状态。默认情况下,它使用 SQLite,这是一个轻量级的嵌入式数据库。但在生产环境中,强烈建议使用更健壮的数据库如 PostgreSQL 或 MySQL,以确保数据完整性、性能和可扩展性。
开源版 vs. 企业版功能对比:
n8n 提供开源社区版和商业企业版。
对于大多数用户而言,开源版已能满足绝大部分需求。当您需要管理大量团队成员、有严格安全合规要求或需要专业支持时,才需考虑企业版。
适用场景:
部署n8n是使用的第一步。对于生产环境,我们推荐使用Docker或Kubernetes,因为它们提供了更好的可移植性、可伸缩性和易维护性。
Docker 是容器化技术的领导者,能够将 n8n 及其所有依赖项打包到一个可移植的容器中,实现快速部署和环境一致性。
Docker 安装与基本概念回顾:
确保您的系统已安装 Docker Engine 和 Docker Compose。如果您不熟悉 Docker,建议先查阅 Docker 官方文档进行基础学习。
单容器部署指南:
这是最简单的部署方式,适合快速测试或开发环境。数据默认存储在容器内部,重启容器可能会丢失数据,除非使用卷挂载。
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
n8nio/n8n
-it: 交互式模式--rm: 容器停止后自动删除--name n8n: 给容器命名为 n8n-p 5678:5678: 将宿主机的 5678 端口映射到容器的 5678 端口(n8n 默认端口)-v ~/.n8n:/home/node/.n8n: 关键! 将宿主机的 ~/.n8n 目录挂载到容器的 /home/node/.n8n 目录。这是 n8n 存储其配置、凭据和 SQLite 数据库的默认位置,确保数据持久化。n8nio/n8n: 指定使用的 n8n 官方 Docker 镜像。运行后,您可以通过浏览器访问 http://localhost:5678 来访问 n8n。
Docker Compose 多服务部署(包含PostgreSQL、Redis):
对于生产环境,强烈推荐使用 Docker Compose 部署 n8n,并连接到外部的 PostgreSQL 数据库和 Redis 缓存。PostgreSQL 用于存储核心数据(工作流、凭据),Redis 用于存储队列和会话数据,提高性能和稳定性。
创建 docker-compose.yml 文件:
version: '3.8'
services:
n8n:
image: n8nio/n8n
restart: always
ports:
- "5678:5678"
environment:
- N8N_HOST=${N8N_HOST:-localhost}
- N8N_PROTOCOL=${N8N_PROTOCOL:-http}
- WEBHOOK_URL=${WEBHOOK_URL:-http://localhost:5678/} # 生产环境改为您的公网URL
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB:-n8n}
- DB_POSTGRESDB_USER=${POSTGRES_USER:-n8n}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD:-n8n}
- QUEUE_HEALTH_CHECK_ACTIVE=true # 启用队列健康检查
- QUEUE_TYPE=redis
- QUEUE_REDIS_HOST=redis
- QUEUE_REDIS_PORT=6379
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY} # 重要:设置加密密钥
- N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE:-false}
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
- TZ=${TZ:-Asia/Shanghai} # 设置时区
volumes:
- n8n_data:/home/node/.n8n
postgres:
image: postgres:13
restart: always
environment:
- POSTGRES_DB=${POSTGRES_DB:-n8n}
- POSTGRES_USER=${POSTGRES_USER:-n8n}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-n8n}
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:6-alpine
restart: always
command: redis-server --appendonly yes
volumes:
- redis_data:/data
volumes:
n8n_data:
postgres_data:
redis_data:
创建 .env 文件来管理环境变量:
# .env
N8N_HOST=your.domain.com # 您的域名或IP地址
N8N_PROTOCOL=https # 如果使用HTTPS
WEBHOOK_URL=https://your.domain.com/ # Webhook回调URL
POSTGRES_DB=n8n_prod
POSTGRES_USER=n8n_user
POSTGRES_PASSWORD=your_strong_db_password
N8N_ENCRYPTION_KEY=a_very_long_and_random_string_for_encryption_key # 至少32位随机字符
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=your_strong_admin_password
TZ=Asia/Shanghai
在 docker-compose.yml 和 .env 文件所在的目录执行:
docker-compose up -d
这将启动 n8n、PostgreSQL 和 Redis 三个服务。
环境变量配置(持久化、时区、认证):
在 Docker Compose 示例中,我们配置了以下重要的环境变量:
N8N_HOST, N8N_PROTOCOL, WEBHOOK_URL: 用于正确生成 webhook URL。在生产环境,必须将 WEBHOOK_URL 设置为您的公网可访问的域名或IP。DB_TYPE, DB_POSTGRESDB_HOST 等: 配置 n8n 连接 PostgreSQL 数据库。QUEUE_TYPE, QUEUE_REDIS_HOST 等: 配置 n8n 使用 Redis 作为队列。N8N_ENCRYPTION_KEY: 极度重要! 用于加密存储在数据库中的敏感凭据(如 API Keys)。请务必生成一个复杂且随机的字符串,并妥善保管。一旦丢失,您将无法解密现有凭据。N8N_BASIC_AUTH_ACTIVE, N8N_BASIC_AUTH_USER, N8N_BASIC_AUTH_PASSWORD: 启用并设置 n8n UI 的基础认证,增加安全性。TZ: 设置容器内部的时区,确保定时任务(Cron Trigger)的准确性。对于需要高可用、大规模部署和更精细资源管理的场景,Kubernetes 是理想选择。n8n 官方提供了 Helm Chart,简化了部署过程。
Helm Chart 配置与部署:
Helm 是 Kubernetes 的包管理器。首先确保您的 Kubernetes 集群已就绪,并安装了 Helm。
# 添加 n8n Helm 仓库
helm repo add n8n-charts https://n8n.io/helm-charts/
helm repo update
# 创建一个 values.yaml 文件进行配置
# values.yaml (部分关键配置)
# persistence:
# enabled: true
# storageClass: "your-storage-class" # 您的持久卷存储类
# size: 10Gi
# externalDatabase:
# type: "postgres"
# host: "your-external-postgres-host"
# port: 5432
# database: "n8n"
# user: "n8n"
# password: "your_strong_db_password"
# externalRedis:
# enabled: true
# host: "your-external-redis-host"
# port: 6379
# environment:
# N8N_ENCRYPTION_KEY: "a_very_long_and_random_string_for_encryption_key"
# WEBHOOK_URL: "https://your.n8n.domain.com/"
# N8N_BASIC_AUTH_ACTIVE: "true"
# N8N_BASIC_AUTH_USER: "admin"
# N8N_BASIC_AUTH_PASSWORD: "your_strong_admin_password"
# ingress:
# enabled: true
# className: "nginx" # 或您的 Ingress Controller
# hosts:
# - host: your.n8n.domain.com
# paths:
# - path: /
# pathType: Prefix
# tls:
# - hosts:
# - your.n8n.domain.com
# secretName: n8n-tls-secret # 提前创建或由 cert-manager 自动生成
# service:
# type: ClusterIP # 或 LoadBalancer
# resources: # 资源限制与请求
# requests:
# cpu: 500m
# memory: 1Gi
# limits:
# cpu: 1000m
# memory: 2Gi
# 部署 n8n
helm install n8n n8n-charts/n8n -f values.yaml
持久卷(Persistent Volume)配置:
在 Kubernetes 中,工作流和凭据数据应存储在持久卷上,以确保数据不会随 Pod 的重启而丢失。在 values.yaml 中配置 persistence.enabled: true 并指定 storageClass。
Ingress 配置与负载均衡:
Ingress 用于暴露 n8n 服务到集群外部,并可以配置域名、SSL/TLS 证书。它通常与 Nginx Ingress Controller 或 Traefik 等负载均衡器配合使用。
如果您不想自己管理服务器,也可以选择一些提供容器托管服务的云平台。
AWS ECS/EC2 + RDS 持久化方案:
在 AWS 上,您可以将 n8n 部署为 ECS Fargate 服务(无服务器容器),将 PostgreSQL 数据库部署为 RDS 实例。这种方式简化了基础设施管理。
Render、Railway 等平台快速部署:
这些平台提供了非常简单的部署界面,可以直接从 GitHub 仓库或 Docker 镜像部署 n8n,并自动处理域名、SSL 和数据库连接,适合快速原型开发或小型应用。
安全是任何生产系统的基石。以下步骤至关重要。
设置 N8N_ENCRYPTION_KEY 进行敏感数据加密:
这个环境变量用于加密您的凭据(例如 API 密钥、OAuth 令牌)。务必在首次启动 n8n 前设置它,且不要随意更改或丢失! 更改密钥会导致无法解密旧的凭据。
# 生成一个随机密钥 (例如使用 OpenSSL)
openssl rand -base64 32
将其添加到您的 Docker Compose .env 文件或 Kubernetes values 中。
配置用户认证(Basic Auth, OAuth2):
默认情况下,n8n 没有用户认证。为了防止未经授权的访问,请务必启用认证。
.env 中设置 N8N_BASIC_AUTH_ACTIVE=true, N8N_BASIC_AUTH_USER 和 N8N_BASIC_AUTH_PASSWORD。启用 HTTPS(Nginx/Caddy 反向代理,Let's Encrypt 自动续签):
所有公共访问的 Webhook URL 和 n8n UI 都应通过 HTTPS 保护,以加密数据传输。这通常通过在 n8n 前面部署一个反向代理服务器(如 Nginx 或 Caddy)来实现,并配置 Let's Encrypt 自动生成和续签 SSL 证书。
例如,使用 Nginx 配置:
server {
listen 80;
server_name your.n8n.domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name your.n8n.domain.com;
ssl_certificate /etc/letsencrypt/live/your.n8n.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your.n8n.domain.com/privkey.pem;
location / {
proxy_pass http://localhost:5678; # n8n 内部地址和端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
熟悉 n8n 的用户界面是高效使用的基础。
这是您登录 n8n 后的主界面,提供了工作流的概览。
这是您构建和修改工作流的核心区域。
在画布上双击或点击“+”按钮,可以弹出节点搜索框,快速找到并添加所需节点。
在编辑模式下,点击任何一个节点,其右侧面板会显示该节点的配置选项。在工作流执行后,点击节点可以看到该节点的“输入”(Input)和“输出”(Output)数据,这对于调试至关重要。您可以点击“Test Workflow”按钮来手动执行当前工作流并预览数据流。
凭据用于安全地存储您的 API Key、OAuth 令牌、用户名/密码等敏感信息,供工作流中的节点使用。
将敏感信息与工作流逻辑分离,提高安全性。当凭据过期或需要更新时,只需更新凭据本身,而无需修改所有使用该凭据的工作流。
在 n8n 界面左侧导航栏找到“Credentials”(钥匙图标),点击“New Credential”创建新凭据。根据不同服务的要求(OAuth2, API Key, Basic Auth, Token 等),选择相应的凭据类型并填写所需信息。n8n 会引导您完成 OAuth2 认证流程。
提供了 n8n 实例的全局配置。
WEBHOOK_URL 环境变量设置正确,否则外部服务可能无法正确回调您的 n8n 实例。工作流由触发器、功能节点和应用节点组成,通过连接线构建数据流。
每个工作流都必须有一个触发器,它定义了工作流何时启动。
Webhook Trigger:
Cron Trigger:
# Cron 表达式示例
* * * * * # 每分钟
0 0 * * * # 每天午夜
0 9 * * 1-5 # 周一至周五,每天上午9点
应用程序特定触发器:
许多应用节点也提供自己的触发器功能,例如:
Gmail New Email: 当收到新邮件时触发。Slack New Message: 当 Slack 频道收到新消息时触发。Airtable New Record: 当 Airtable 表格中添加新记录时触发。HTTP Request Trigger:
此触发器允许您在特定 URL 收到请求时启动工作流,并且可以更灵活地配置请求参数,例如处理不同的 HTTP 方法、路径参数等。
这些节点是构建工作流逻辑的基石。
HTTP Request:
?key=value 参数。Set:
Merge:
SplitInBatches:
Code:
items: 包含所有输入数据项的数组。$json: 访问当前项的 JSON 数据。$node: 访问特定节点的输出数据。_ (lodash): 内置的实用工具库。moment: 内置的日期时间处理库。// Code 节点示例:计算总价并添加新字段
const newItems = items.map(item => {
const quantity = item.json.quantity;
const price = item.json.price;
const total = quantity * price;
return {
json: {
...item.json, // 复制所有现有字段
totalPrice: total // 添加新字段
}
};
});
return newItems;
If:
// 复杂条件表达式示例
// 如果订单金额大于100且客户等级为VIP
${{ $json.amount > 100 && $json.customerTier === 'VIP' }}
Wait:
NoOp:
Try/Catch:
n8n 内置了大量针对特定应用的节点,简化了与这些服务的集成。
例如 Google Sheets, Slack, Telegram, Email, Notion, Airtable, Salesforce, OpenAI 等。
每个应用节点通常有以下配置:
对于 Google Sheets 这样的 OAuth2 服务,您需要:
对于 Notion 这样的 API Key 服务,您需要:
精通数据处理是构建强大n8n工作流的关键。
n8n 内部所有数据都以“项”(Items)的数组形式传递。
理解 items 数组结构与 json 对象:
每个 item 对象通常包含两个主要属性:
item.json: 存储实际的 JSON 数据负载。这是您在节点配置中最常引用和操作的数据。item.binary: 可选属性,用于存储二进制数据(如图片、文件)。当工作流处理多个数据记录时,例如从数据库查询出多条记录,每个记录会作为 items 数组中的一个单独的 item。
如何访问前一个节点的数据:
${{ $json.field_name }}: 最常用。 访问当前处理的 item 的 json 数据中的 field_name 字段。${{ $node["PreviousNodeName"].json.field_name }}: 访问指定名称的 PreviousNodeName 节点的输出数据中的 json.field_name。这在需要跨节点引用数据时非常有用。${{ $item(index).json.field_name }}: 访问 items 数组中特定索引 index 的项的 json.field_name。${{ $items("PreviousNodeName")[index].json.field_name }}: 访问指定节点输出的 items 数组中特定索引的项的数据。表达式是 n8n 的核心之一,允许您动态地构建值、条件和逻辑。
基本表达式语法:
表达式以 ${{ ... }} 包裹。在其中可以编写 JavaScript 片段。
// 访问字段
${{ $json.email }}
// 字符串拼接
${{ 'Hello ' + $json.name + '!' }}
// 数学运算
${{ $json.price * $json.quantity }}
使用 JavaScript 函数:
您可以在表达式中使用大部分标准的 JavaScript 函数。
// 转换为大写
${{ $json.name.toUpperCase() }}
// 获取字符串长度
${{ $json.description.length }}
// 日期格式化 (使用内置的 moment 库)
${{ moment($json.timestamp).format('YYYY-MM-DD HH:mm:ss') }}
复杂条件表达式:
在 If 节点或 Code 节点中,您可以构建复杂的布尔逻辑。
// 订单金额大于100且状态为“已支付”
${{ $json.amount > 100 && $json.status === 'paid' }}
// 客户等级为VIP或通过邮件订阅
${{ $json.customerTier === 'VIP' || $json.emailSubscribed === true }}
JMESPath 高级查询:
n8n 也支持 JMESPath,这是一种用于 JSON 数据的高级查询语言,特别适合过滤、转换和提取嵌套数据。
要使用 JMESPath,通常在 Code 节点中引入,或者在某些节点的“表达式”字段直接使用。jmespath.search(data, expression)
// 提取 status 为 'active' 的所有 id
$json.users[?status=='active'].id
// 将数组中的对象转换为新结构
$json.products.{name: product_name, price: price_usd}
// 提取所有订单中的所有商品名称
$json.orders[].items[].name
JMESPath 在 Code 节点中使用时需要引入:const jmespath = require('jmespath');
数据的格式化和清洗是自动化流程中不可或缺的一环。
当 Set 节点无法满足需求时,Code 节点提供了无限可能。您可以使用 JavaScript 的 map(), filter(), reduce() 等数组方法,以及 Lodash (_) 库进行复杂的数据操作。
// Code 节点:聚合订单数据
const aggregatedData = items.reduce((acc, item) => {
const customerId = item.json.customerId;
if (!acc[customerId]) {
acc[customerId] = {
customerId: customerId,
totalOrders: 0,
totalAmount: 0,
orderDates: []
};
}
acc[customerId].totalOrders++;
acc[customerId].totalAmount += item.json.amount;
acc[customerId].orderDates.push(item.json.orderDate);
return acc;
}, {});
return [{ json: Object.values(aggregatedData) }];
当从一个源获取大量数据,但目标 API 有速率限制时,Split In Batches 节点非常有用。它将一个大数据项数组拆分成多个小批次,每个批次独立执行后续节点。处理完所有批次后,可以使用 Merge 节点将所有批次的输出再次合并。
优雅的错误处理和高效的调试是构建健壮工作流的必备技能。
Try/Catch 节点提供了一种结构化的错误处理方式,类似于编程语言中的 try-catch 块。
您可以将可能发生错误的节点放入 Try 块中。如果 Try 块内的任何节点失败,控制流会立即转移到 Catch 块。Catch 节点会接收到一个包含错误信息的 item。
在 Catch 节点之后,您可以添加:
console.log() 在 Code 节点中打印调试信息:
在 Code 节点中,您可以像在常规 JavaScript 中一样使用 console.log() 来打印变量的值或调试信息。这些信息会显示在 Code 节点的输出数据中,或者如果您查看 n8n 运行的 Docker 容器日志,也可以看到。
console.log('当前数据:', items[0].json);
console.log('API响应状态码:', $node["HTTP Request"].json.statusCode);
return items; // 必须返回 items,否则数据流会中断
在“Test Workflow”模式下,您可以点击工作流中的任意节点,查看其在当前执行步骤中的输入和输出数据。这让您可以逐个节点地跟踪数据流,定位问题所在。
子工作流是组织复杂工作流、提高复用性和可维护性的强大工具。
什么是子工作流?
子工作流是作为一个独立的工作流创建的,但可以通过 Call Workflow 节点在另一个“主工作流”中调用。它就像一个函数或一个微服务,接收输入并返回输出。
为什么使用子工作流?
Start/End 节点在子工作流中的作用:
它们允许主工作流与子工作流进行参数传递和结果接收。
Call Workflow 节点参数传递与结果接收:
在主工作流中,使用 Call Workflow 节点来调用子工作流。您可以在该节点中配置:
将重复或独立的逻辑抽象为子工作流。
Code 节点是 n8n 的“瑞士军刀”,让您能够突破图形化界面的限制,实现任何自定义逻辑。
如何访问 items、$json、$node 等内置对象:
在 Code 节点中,您可以直接访问以下全局可用的变量:
items: 一个数组,包含所有流入该 Code 节点的输入数据项。每个项都有 json 和 binary 属性。$json: 当前处理的 item 的 json 数据。当 Code 节点处理单个项时,您可以直接使用它。$node["NodeName"]: 访问名为 NodeName 的节点的所有输出数据。_ (lodash): 一个流行的 JavaScript 实用工具库,提供数组、对象、函数等操作的便捷方法。moment: 一个 JavaScript 日期处理库。axios: 用于发送 HTTP 请求的库。const _ = require('lodash'); // 显式引入 lodash
const moment = require('moment'); // 显式引入 moment
// 示例:从输入数据中筛选并转换
const filteredItems = items.filter(item => item.json.status === 'completed');
const transformedItems = filteredItems.map(item => ({
json: {
orderId: item.json.id,
customerName: item.json.customer.name,
processedDate: moment().format('YYYY-MM-DD HH:mm:ss')
}
}));
// 返回处理后的数据,Code 节点必须返回一个包含 items 的数组
return transformedItems;
常用 JavaScript 内置方法(map, filter, reduce 等):
充分利用 JavaScript 数组和对象的方法来处理 n8n 的数据结构。
items.map(...): 对每个输入项进行转换,生成新的项数组。items.filter(...): 根据条件筛选输入项,返回符合条件的项数组。items.reduce(...): 将输入项聚合成单个值或对象(如统计总和)。n8n 提供的辅助函数:
在 Code 节点中,n8n 提供了一些辅助函数来更方便地操作节点参数和数据。
getNodeParameter(parameterName, defaultValue): 获取当前 Code 节点配置中的参数值。getDataProperty(data, path): 安全地从复杂对象中获取嵌套属性。集成第三方 npm 包:
默认情况下,Code 节点只支持 n8n 内置的少数几个库。如果您需要使用其他 npm 包,例如 xml2js 或 axios(尽管 HTTP Request 节点通常已足够),您需要:
npm install <package-name>。然后在 Code 节点中通过 require('package-name') 引入。
结合 Webhook Trigger 和 Code 节点,n8n 可以作为轻量级的 API 服务,响应自定义请求。
在 Webhook Trigger 收到请求后,您可以:
// Code 节点示例:简单的API响应
const requestBody = items[0].json.body; // 从 Webhook Trigger 获取请求体
if (requestBody && requestBody.action === 'greet') {
return [{
json: {
status: 'success',
message: `Hello, ${requestBody.name || 'Guest'}!`
}
}];
} else {
return [{
json: {
status: 'error',
message: 'Invalid request'
},
// 设置HTTP状态码
statusCode: 400
}];
}
生产环境的部署需要考虑数据持久性、可伸缩性和版本管理。
数据存储介质选择:SQLite (默认), PostgreSQL, MySQL:
数据备份与恢复策略:
定期备份 n8n 使用的数据库是非常重要的。根据您选择的数据库,制定相应的备份策略:
pg_dump / mysqldump 工具进行逻辑备份,或使用数据库的物理备份(如 EBS 快照)。n8n_data 卷)。# PostgreSQL 备份示例
docker exec -t postgres pg_dumpall -c -U n8n > dump_$(date +%Y-%m-%d).sql
推荐的升级流程与注意事项:
# Docker Compose 升级
docker-compose pull n8n
docker-compose up -d --remove-orphans # 确保清除旧的服务
# npm 升级
npm update n8n -g
兼容性检查: 尤其在跨大版本升级时,某些节点配置或内部 API 可能会有变化。在测试环境充分验证后再推送到生产。
工作流设计优化:
Split In Batches 节点来分批处理大量数据,而不是一次性处理。资源配置:CPU、内存、并发执行数:
# Docker Compose environment
- N8N_WORKFLOW_CONCURRENCY=20
分布式部署考量:多个工作器 (Worker) 节点与 Redis 队列:
当单个 n8n 实例无法满足性能需求时,可以部署多个 n8n Worker 实例。这些 Worker 实例共享同一个 PostgreSQL 数据库和 Redis 队列。Redis 充当任务队列,协调不同 Worker 之间的任务分配,实现负载均衡。
在 Docker Compose 中配置多个 Worker:可以复制 n8n 服务并命名为 n8n_worker_1, n8n_worker_2 等,并确保它们连接到同一个 PostgreSQL 和 Redis 服务。
理论知识的掌握最终要通过实践来检验。以下两个详细的项目将帮助您巩固所学,并体会 n8n 的强大之处。
场景: 您的网站有一个联系表单(例如使用 Typeform、Google Forms 或自定义HTML表单),当有用户提交表单后,您希望:
Webhook Trigger:接收表单提交数据。
Webhook 节点作为触发器。Webhook 节点:
HTTP Method: 选择 POST (因为表单提交通常是 POST 请求)。action 属性)。// Webhook Trigger 接收到的示例数据
{
"json": {
"name": "张三",
"email": "[email protected]",
"message": "我对贵公司产品很感兴趣!",
"timestamp": "2023-10-27T10:30:00Z"
}
}
Set 节点:提取并格式化所需数据。
Set 节点。Keep Only Set: 启用,只保留您设置的字段。Values:
Name: fullName, Value: ${{ $json.name }}Name: userEmail, Value: ${{ $json.email }}Name: inquiryMessage, Value: ${{ $json.message }}Name: submissionTime, Value: ${{ moment($json.timestamp).format('YYYY-MM-DD HH:mm:ss') }} (使用 moment 格式化时间)Google Sheets 节点:将数据添加到指定工作表。
Google Sheets 节点。Credential: 选择您的 Google Sheets 凭据。Operation: Append Row (添加行)。Spreadsheet ID: 填写您的 Google Sheets 文档 ID(URL 中 /d/ 和 /edit 之间的那串字符)。Sheet Name: 填写工作表名称(如 "Leads")。Data to Send: 设置要添加到表格的列名和对应的值。确保列名与您 Google Sheet 中的表头一致。
Name: 姓名, Value: ${{ $json.fullName }}Name: 邮箱, Value: ${{ $json.userEmail }}Name: 留言, Value: ${{ $json.inquiryMessage }}Name: 提交时间, Value: ${{ $json.submissionTime }}Gmail/SMTP 节点(用户):发送确认邮件(包含动态数据)。
Gmail 或 SMTP Email 节点。Credential: 选择您的邮件凭据。From Email: 您的发件邮箱。To Email: ${{ $json.userEmail }} (发送给用户)。Subject: 感谢您的咨询 - [您的公司名称]Body: 编写邮件正文,可以使用 HTML 格式。
尊敬的 ${{ $json.fullName }},
感谢您联系我们!我们已收到您的咨询:
“${{ $json.inquiryMessage }}”
我们将尽快与您联系。如有其他疑问,请随时回复此邮件。
祝好!
您的公司团队
Gmail/SMTP 节点(管理员):发送通知邮件。
Gmail 或 SMTP Email 节点。To Email: 您的团队邮箱地址(例如 [email protected])。Subject: 【新咨询】来自 ${{ $json.fullName }} 的表单提交Body: 包含所有提交详情,方便团队查看。
新的网站咨询已提交:
姓名:${{ $json.fullName }}
邮箱:${{ $json.userEmail }}
留言:${{ $json.inquiryMessage }}
提交时间:${{ $json.submissionTime }}
请及时处理。
错误处理:使用 Try/Catch 捕获发送邮件或写入表格的错误。
Try 节点。Catch 节点到 Try 节点的错误输出。Slack 或 Email 节点,用于发送错误通知给系统管理员,包含错误信息:${{ $json.error.message }}。通过这个项目,您将掌握 Webhook 接收、数据提取、Google Sheets 写入、邮件发送以及基本的错误处理。
场景: 您希望监控某个或多个技术博客、新闻网站的 RSS 订阅源,当有新文章发布时,自动将文章标题和链接发布到您的 Telegram 频道,并且需要实现去重,避免重复发布。
RSS Feed Read Trigger:定时拉取RSS源最新内容。
RSS Feed Read 节点作为触发器。URL: 填写您要监控的 RSS 源 URL(例如:https://www.n8n.io/blog/rss.xml)。Interval: 设置拉取频率(例如:每 30 分钟)。Return All: 设置为 false,只返回最新的。Read Older Feeds: 首次激活时可以设置为 false,避免拉取所有历史文章。Code 节点:实现去重逻辑。
为了避免重复发布,我们需要一个机制来记录已发布的文章。这里我们将使用 n8n 的内置持久化变量。
Code 节点。const publishedUrlsKey = 'published_rss_urls';
let publishedUrls = await n8n.getContext(publishedUrlsKey, []); // 从上下文获取已发布的URL列表,默认空数组
const newItems = [];
for (const item of items) {
const url = item.json.link; // 假设文章链接是唯一标识
if (!publishedUrls.includes(url)) {
// 如果URL不在已发布列表中,则为新文章
newItems.push(item);
publishedUrls.push(url); // 添加到已发布列表
}
}
// 更新上下文中的已发布URL列表
await n8n.setContext(publishedUrlsKey, publishedUrls);
// 只返回新文章
return newItems;
上述代码使用了 n8n.getContext() 和 n8n.setContext()。这是 n8n 提供的内置方法,用于在工作流的多次执行之间持久化少量数据。
If 节点:判断是否有新文章。
If 节点。Value 1: ${{ $json.items.length }} (如果 Code 节点输出了新文章,则 items 数组长度会大于 0)。Operation: Greater than (大于)。Value 2: 0。Telegram 节点:发送格式化后的文章信息到指定频道。
Telegram 节点。Credential: 选择您的 Telegram 凭据。Operation: Send Message。Chat ID: 填写您要发送的 Telegram 频道或群组 ID (需要以 @ 开头,或者数字 ID)。Text: 编写要发送的消息内容,可以使用 Markdown 格式美化。
**新文章发布:**
${{ $json.title }}
_来源:${{ $json.creator }}_
[阅读原文](${{ $json.link }})
Parse Mode: 设置为 HTML 或 Markdown,以便解析消息中的链接和粗体等格式。错误处理与日志记录:
Log 节点,记录发布成功。Try/Catch 节点封装 Telegram 发布逻辑,如果发送失败,则通过邮件或 Slack 通知管理员。此项目展示了如何使用定时触发、数据去重、条件判断和第三方服务集成。
n8n 在企业中拥有广泛的应用场景,能够显著提升运营效率。
ERP/CRM数据同步:
Cron触发 → CRM/ERP API节点(获取最新数据) → 数据清洗/转换 → 数据库/另一个CRM/ERP节点(更新/插入) → 审计日志记录。AI智能工单系统:
邮件触发(新客户咨询) → OpenAI节点(分类工单/生成摘要) → CRM节点(创建工单并添加AI分析结果) → Slack/企业微信通知客服团队。营销自动化:
数据库触发(新用户注册) → If节点(判断用户属性) → SendGrid/Mailchimp节点(发送个性化邮件) → Wait节点(等待N天) → SendGrid/Mailchimp节点(发送第二封邮件)。数据管道与ETL:
Cron触发 → HTTP Request/Database节点(数据提取) → Code/Set节点(数据转换与清洗) → PostgreSQL/BigQuery节点(数据加载) → 日志与通知。API网关与微服务编排:
Webhook Trigger → HTTP Request节点(调用微服务A) → HTTP Request节点(调用微服务B) → Merge/Code节点(聚合响应) → Webhook Response节点。恭喜您!您已经完成了这份n8n从入门到精通的全栈教程。n8n的强大功能远不止于此,鼓励您继续探索其丰富的节点库,并尝试构建更多复杂的自动化工作流。实践是最好的老师,祝您在自动化之路上越走越远!