构建你的第一个n8n工作流:Webhooks、API调用和通知
在自托管实例上从零构建两个实际的n8n工作流。一个通过webhook获取天气数据并发送到Discord,另一个监控RSS并将新文章发布到频道。
你的VPS上已经运行了n8n。接下来做什么?
在本教程中,你将从零构建两个实际的工作流。不是那种把数据发送到虚空的玩具示例。这些是你会持续运行的自动化流程:
- 天气webhook:接收HTTP请求,调用wttr.in天气API,格式化响应,然后发送到Discord频道。
- RSS监控:定时检查博客的RSS feed,将新文章发布到Discord。
两个工作流在构建过程中涵盖了n8n的核心概念:节点(nodes)、连接(connections)、表达式(expressions)、n8n 2.0的草稿/发布系统以及错误处理。
前提条件:
- VPS上有一个正在运行的n8n实例。如果还没有,请先阅读在VPS上使用Docker Compose安装n8n。
- 一个可以创建webhook的Discord服务器(或Slack工作区。操作步骤可互换;这里使用Discord)。
- 基本的终端和
curl使用能力。
什么是n8n的节点和连接?
节点是工作流中的单个步骤。每个节点做一件事:接收触发器、发起HTTP请求、转换数据或发送消息。连接是节点之间的连线,将数据从一个节点的输出传递到下一个节点的输入。每个工作流都是从左到右连接的节点链。
本教程中使用的节点类型:
| 节点 | 用途 |
|---|---|
| Webhook | 监听传入的HTTP请求并启动工作流 |
| HTTP Request | 调用外部API并返回响应 |
| Set | 创建或重组数据字段 |
| If | 根据条件对工作流进行分支 |
| Discord | 通过webhook向Discord频道发送消息 |
| RSS Feed Trigger | 轮询RSS feed,当出现新条目时触发 |
| Error Trigger | 捕获工作流故障并运行通知工作流 |
如何从零构建你的第一个n8n工作流?
在浏览器中打开你的n8n实例。在Workflows页面点击Add workflow。n8n会显示一个空白画布和一个触发器节点占位符。
第一个工作流的功能:通过HTTP webhook接收城市名称,从wttr.in获取当前天气,格式化结果,然后发布到Discord频道。
步骤1:创建Discord webhook
在n8n中构建之前,你需要一个发送通知的目标。
- 打开你的Discord服务器。右键点击你想接收天气更新的频道。
- 选择编辑频道 > 集成 > Webhooks。
- 点击新建Webhook。命名为
n8n Weather Bot。 - 点击复制Webhook URL。保存这个URL。格式类似:
https://discord.com/api/webhooks/123456789/abcDEF...
把这个URL当作密码对待。任何拥有它的人都能在你的频道中发消息。
步骤2:添加Webhook触发器节点
点击画布占位符上的**+按钮。搜索Webhook**并选择它。
配置webhook:
- HTTP Method:POST
- Path:
weather
其余保持默认。path使你的webhook URL唯一。将path设为weather后,你的webhook URL为:
- 测试URL:
https://your-n8n-domain.com/webhook-test/weather - 生产URL:
https://your-n8n-domain.com/webhook/weather
注意区别:/webhook-test/和/webhook/。这个区别很重要,稍后会详细说明。
步骤3:用curl测试webhook
在webhook节点中点击Listen for test event。n8n现在等待测试URL上的传入请求。
在本地机器上打开终端,发送测试请求:
curl -X POST https://your-n8n-domain.com/webhook-test/weather \
-H "Content-Type: application/json" \
-d '{"city": "Paris"}'
切换回n8n。webhook节点应该显示绿色对勾和接收到的数据。你会在输出面板中看到包含city: "Paris"的JSON body。
如果没有反应,检查:
- 你的n8n实例可以从互联网访问(反向代理已配置)。
- 你在发送curl请求之前点击了Listen for test event。
- URL完全匹配,包括
/webhook-test/前缀。
步骤4:添加HTTP Request节点(调用天气API)
点击Webhook节点右侧的**+按钮。搜索HTTP Request**并添加。
配置:
- Method:GET
- URL:
https://wttr.in/{{ $json.city }}?format=j1
{{ $json.city }}部分是一个n8n表达式(expression)。它从传入的webhook数据中提取city字段。当有人发送{"city": "Paris"}时,n8n将表达式替换为Paris,最终URL为https://wttr.in/Paris?format=j1。
?format=j1参数告诉wttr.in返回结构化JSON,而不是ASCII艺术天气报告。
点击Test step仅运行此节点。你应该看到包含current_condition、temp_C、weatherDesc等字段的JSON响应。
**仔细观察:**看输出面板。响应是嵌套的。当前温度在$json.current_condition[0].temp_C,描述在$json.current_condition[0].weatherDesc[0].value。下一步需要这些路径。
步骤5:添加Set节点格式化消息
天气API的原始响应很大。Discord消息只需要几个字段。
在HTTP Request节点后添加一个Set节点。点击Add field并创建以下赋值:
| 字段名 | 类型 | 值(表达式) |
|---|---|---|
message |
String | Weather in {{ $('Webhook').item.json.city }}: {{ $json.current_condition[0].temp_C }}°C, {{ $json.current_condition[0].weatherDesc[0].value }}. Humidity: {{ $json.current_condition[0].humidity }}%. Wind: {{ $json.current_condition[0].windspeedKmph }} km/h. |
表达式{{ $('Webhook').item.json.city }}回溯到Webhook节点的输出以获取城市名称。不带节点名称的$json引用从紧邻的前一个节点(HTTP Request)获取数据。
点击Test step。输出应显示单个message字段,内容类似:
Weather in Paris: 14°C, Partly cloudy. Humidity: 72%. Wind: 15 km/h.
步骤6:添加Discord节点
在Set节点后添加一个Discord节点。
- 将Connection Type设为Webhook。
- 在Credential for Discord下,点击Create New Credential。
- 将步骤1中的Discord webhook URL粘贴到Webhook URL字段。点击Save。
- 将Operation设为Send a Message。
- 在Message字段中使用表达式:
{{ $json.message }}
点击Test step。检查你的Discord频道。你应该看到机器人发布的天气消息。
**验证:**打开Discord。消息应出现在你配置webhook的频道中。如果没有,重新检查credential设置中的webhook URL。
步骤7:测试完整工作流
回到Webhook节点。再次点击Listen for test event。发送另一个curl请求:
curl -X POST https://your-n8n-domain.com/webhook-test/weather \
-H "Content-Type: application/json" \
-d '{"city": "Tokyo"}'
观察执行流经所有四个节点。每个节点完成时变绿。东京的天气报告应出现在你的Discord频道中。
查看左侧边栏的Executions标签。你会看到此测试执行的日志条目,包含时间、状态和每个节点的数据。这个执行日志是你调试问题的地方。
n8n的webhook节点如何接收外部数据?
Webhook节点在你的n8n实例上创建一个HTTP端点。当外部服务(或curl命令)向该端点发送请求时,n8n接收数据并启动工作流。该节点支持GET、POST、PUT、PATCH、DELETE和HEAD方法。POST加JSON body是最常见的模式。
如何用curl测试n8n webhook?
你在上面已经做过了。关键点如下:
| 测试URL | 生产URL | |
|---|---|---|
| 路径格式 | /webhook-test/<path> |
/webhook/<path> |
| 何时激活 | 仅在编辑器中点击"Listen for test event"或"Execute workflow"时 | 仅在发布工作流后 |
| 在编辑器中显示数据 | 是,在节点输出面板中实时显示 | 否(查看Executions标签) |
| 使用场景 | 构建和调试 | 正式的外部集成 |
开发期间始终使用测试URL。它让你实时看到数据流经每个节点。生产URL仅在发布工作流后才有效。
n8n 2.0中草稿和已发布工作流有什么区别?
n8n 2.0将保存和激活分开了。你的编辑保持在草稿状态,在你明确发布之前不会影响线上版本。从n8n 2.4(2026年1月)开始,编辑器每隔几秒自动保存你的工作。不再有手动保存按钮。
流程如下:
- 你使用测试URL构建和测试工作流。n8n随时自动保存。
- 你的更改仅存在于草稿中。线上版本(如果有的话)继续不变地运行。
- 你点击Publish。现在生产URL已激活,工作流在触发时自动运行。
- 如果你之后编辑工作流,更改将保持在草稿状态直到你再次发布。
在n8n 1.x中,保存和激活是同一个操作。现在不是了。
现在发布你的天气工作流。点击右上角的Publish按钮(或按Shift+P)。工作流状态变为"Active"。
这次使用生产URL用curl验证:
curl -X POST https://your-n8n-domain.com/webhook/weather \
-H "Content-Type: application/json" \
-d '{"city": "Berlin"}'
检查Discord。柏林的天气报告应该出现了。然后查看n8n中的Executions标签,确认生产执行已记录。
如何在n8n工作流中处理错误?
Error Trigger节点捕获工作流故障并运行单独的通知工作流。当活跃的工作流失败时(例如天气API宕机或Discord拒绝消息),n8n在关联的错误工作流中触发Error Trigger。这仅适用于已发布的、自动触发的执行。手动测试执行不会触发它。
构建错误通知工作流
- 回到Workflows页面。点击Add workflow。命名为
Error Handler。 - 添加一个Error Trigger节点作为触发器。当关联的工作流失败时,此节点自动接收错误数据。
- 在Error Trigger后添加一个Discord节点。
- 使用之前创建的Discord webhook credential配置它。
- 将消息设为:
⚠️ Workflow failed: {{ $json.workflow.name }}
Error: {{ $json.execution.error.message }}
Execution ID: {{ $json.execution.id }}
- 错误工作流自动激活,因为它包含Error Trigger节点。不需要单独发布。
将错误工作流链接到你的天气工作流
- 打开你的Weather Webhook工作流。
- 点击右上角的三点菜单(⋮),然后点Settings。
- 在Error Workflow下,选择你刚创建的
Error Handler工作流。 - 点击Publish应用更改。
现在如果天气API宕机或工作流中的任何节点在生产执行期间抛出错误,你会收到Discord通知,包含工作流名称、错误消息和执行ID。你可以用这个执行ID在Executions标签中找到失败的运行,精确检查哪里出了问题。
**这是你应该在每个工作流中复用的模式。**创建一个Error Handler工作流,然后将所有其他工作流链接到它。
n8n表达式快速参考
表达式用于引用前序节点的数据。它们放在双花括号{{ }}中,可在大多数节点字段中使用。
| 表达式 | 功能 |
|---|---|
{{ $json.fieldName }} |
访问前一节点输出中的字段 |
{{ $json.nested.field }} |
访问嵌套的JSON属性 |
{{ $('NodeName').item.json.field }} |
按名称访问特定节点的输出 |
{{ $json.current_condition[0].temp_C }} |
访问数组元素 |
{{ $now.toFormat('yyyy-MM-dd') }} |
用Luxon格式化的当前日期 |
{{ $now.toFormat('HH:mm') }} |
当前时间(24小时制) |
{{ $if($json.score > 80, "high", "low") }} |
条件表达式 |
{{ $json['field with spaces'] }} |
方括号表示法,用于特殊字符 |
n8n使用Luxon处理日期。如果你需要格式化API响应中的日期,Luxon方法可在任何DateTime对象上使用。
如何在n8n中构建RSS feed监控工作流?
现在构建第二个工作流,它按计划运行而不是通过webhook。这个工作流监控RSS feed并将新文章发布到Discord。
步骤1:创建工作流
在Workflows页面点击Add workflow。命名为RSS to Discord。
步骤2:添加RSS Feed Trigger
点击触发器占位符并搜索RSS Feed Trigger。添加它。
配置:
- Feed URL:使用任意博客RSS feed。例如:
https://blog.n8n.io/rss/(n8n自己的博客)。 - Poll Times:设为Every X > Value:
30> Unit:Minutes。
这每30分钟检查一次feed是否有新条目。RSS Feed Trigger会记住它已经看过哪些条目。首次运行时输出所有当前条目。之后只输出新条目。
点击Fetch Test Event获取当前feed条目。你应该看到包含title、link、contentSnippet、isoDate和creator字段的条目。
步骤3:添加Set节点格式化消息
添加一个Set节点。创建一个字段:
| 字段名 | 类型 | 值(表达式) |
|---|---|---|
message |
String | 📰 New post: **{{ $json.title }}**\n{{ $json.link }}\nPublished: {{ $json.isoDate }} |
\n在Discord消息中插入换行。标题周围的**使其在Discord的Markdown中加粗。
步骤4:添加Discord节点
添加一个Discord节点。使用相同的webhook credential。将消息设为{{ $json.message }}。
点击Test step。Discord频道中应出现格式化的博客文章通知。
步骤5:发布工作流
点击Publish。RSS Feed Trigger现在每30分钟检查feed并将新条目发布到Discord。
**链接Error Handler:**打开工作流设置,将Error Workflow设为你的Error Handler工作流。再次发布以应用更改。
**验证:**30分钟后查看Executions标签(或临时将轮询间隔改为1分钟)。你应该看到记录的执行,即使没有新条目(工作流运行但在没有新内容时不产生输出)。
如何导出和导入n8n工作流?
将工作流导出为JSON来备份、分享或在n8n实例之间迁移。
导出工作流
- 打开要导出的工作流。
- 点击三点菜单(⋮)> Download。
- n8n将
.json文件保存到你的电脑。
如果你有n8n容器的shell访问权限,也可以从命令行导出:
docker exec n8n n8n export:workflow --id=<workflow-id> --output=/tmp/workflow.json
导入工作流
- 在Workflows页面,点击三点菜单 > Import from file。
- 选择你的
.json文件。 - n8n将工作流导入为草稿。检查它,更新credentials,然后发布。
**注意:**导出的工作流不包含credentials。在新实例上导入后需要重新添加。
故障排除
Webhook返回404: 测试URL仅在编辑器中打开"Listen for test event"时激活。生产URL仅在发布工作流后激活。确保你使用了正确模式的正确URL。
Discord消息没有出现: 验证Discord credential中的webhook URL。直接用curl测试:
curl -X POST "https://discord.com/api/webhooks/YOUR/WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d '{"content": "Test message from curl"}'
如果这个可以但n8n不行,问题在你的n8n Discord节点配置中。
表达式返回undefined:
打开表达式编辑器(点击字段,然后点击表达式开关)。n8n显示前序节点的可用数据。检查确切的字段路径。常见错误:数据嵌套在$json.data.field中时使用了$json.field。
RSS Feed Trigger首次运行时对所有条目触发: 这是预期行为。发布后的首次执行中,触发器输出所有当前feed条目,因为它没有已处理内容的历史记录。后续运行只输出新条目。
错误工作流未触发: 错误工作流仅在已发布的、自动执行的工作流上触发。手动测试执行不会触发它们。验证错误工作流已在主工作流的设置中关联。
检查日志: 如果n8n应用层出了问题,检查容器日志:
docker logs n8n --tail 50
持续监控:
docker logs n8n -f
下一步
两个可用的工作流和一个错误处理器。接下来:
- 用认证头保护你的webhook端点。
- 用Ollama或Claude为工作流添加AI处理。
- 阅读完整的生产加固指南。
- 学习Docker Compose基础知识来管理多服务堆栈。参见用于多服务VPS部署的Docker Compose。
Copyright 2026 Virtua.Cloud. All rights reserved.