你的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使用能力。
节点是工作流中的单个步骤。每个节点做一件事:接收触发器、发起HTTP请求、转换数据或发送消息。连接是节点之间的连线,将数据从一个节点的输出传递到下一个节点的输入。每个工作流都是从左到右连接的节点链。
本教程中使用的节点类型:
在浏览器中打开你的n8n实例。在Workflows页面点击Add workflow。n8n会显示一个空白画布和一个触发器节点占位符。
第一个工作流的功能:通过HTTP webhook接收城市名称,从wttr.in获取当前天气,格式化结果,然后发布到Discord频道。
在n8n中构建之前,你需要一个发送通知的目标。
- 打开你的Discord服务器。右键点击你想接收天气更新的频道。
- 选择编辑频道 > 集成 > Webhooks。
- 点击新建Webhook。命名为
n8n Weather Bot。 - 点击复制Webhook URL。保存这个URL。格式类似:
https://discord.com/api/webhooks//abcDEF...
把这个URL当作密码对待。任何拥有它的人都能在你的频道中发消息。
点击画布占位符上的+按钮。搜索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/。这个区别很重要,稍后会详细说明。
在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实例可以从互联网访问(反向代理已配置)。使用Nginx反向代理、TLS和安全头保护n8n
- 你在发送curl请求之前点击了Listen for test event。
- URL完全匹配,包括
/webhook-test/前缀。
点击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响应。
看输出面板。响应嵌套在一个data包装对象中。当前温度在$json.data.current_condition[0].temp_C,描述在$json.data.current_condition[0].weatherDesc[0].value。下一步需要这些路径。
天气API的原始响应很大。Discord消息只需要几个字段。
在HTTP Request节点后添加一个Set节点。点击Add field并创建以下赋值:
message String
Weather in {{ $('Webhook').item.json.city }}: {{ $json.data.current_condition[0].temp_C }}°C, {{ $json.data.current_condition[0].weatherDesc[0].value }}. Humidity: {{ $json.data.current_condition[0].humidity }}%. Wind: {{ $json.data.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.
在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。
回到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标签。你会看到此测试执行的日志条目,包含时间、状态和每个节点的数据。这个执行日志是你调试问题的地方。
Webhook节点在你的n8n实例上创建一个HTTP端点。当外部服务(或curl命令)向该端点发送请求时,n8n接收数据并启动工作流。该节点支持GET、POST、PUT、PATCH、DELETE和HEAD方法。POST加JSON body是最常见的模式。
你在上面已经做过了。关键点如下:
/webhook-test/
/webhook/
何时激活 仅在编辑器中点击"Listen for test event"或"Execute workflow"时 仅在
发布工作流后
在编辑器中显示数据 是,在节点输出面板中实时显示 否(查看Executions标签)
使用场景 构建和调试 正式的外部集成
开发期间始终使用测试URL。它让你实时看到数据流经每个节点。生产URL仅在发布工作流后才有效。
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标签,确认生产执行已记录。
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工作流,然后将所有其他工作流链接到它。
表达式用于引用前序节点的数据。它们放在双花括号{{ }}中,可在大多数节点字段中使用。
{{ $json.fieldName }} 访问前一节点输出中的字段
{{ $json.nested.field }} 访问嵌套的JSON属性
{{ $('NodeName').item.json.field }} 按名称访问特定节点的输出
{{ $json.data.current_condition[0].temp_C }} 访问数组元素
{{ $now.toFormat('yyyy-MM-dd') }} 用Luxon格式化的当前日期
{{ $now.toFormat('HH:mm') }} 当前时间(24小时制)
} 条件表达式
{{ $json['field with spaces'] }} 方括号表示法,用于特殊字符
n8n使用Luxon处理日期。如果你需要格式化API响应中的日期,Luxon方法可在任何DateTime对象上使用。
现在构建第二个工作流,它按计划运行而不是通过webhook。这个工作流监控RSS feed并将新文章发布到Discord。
在Workflows页面点击Add workflow。命名为RSS to Discord。
点击触发器占位符并搜索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字段的条目。
添加一个Set节点。创建一个字段:
message String
📰 New post: {{ $json.title }} {{ $json.link }} Published: {{ $json.isoDate }}
在Discord消息中插入换行。标题周围的使其在Discord的Markdown中加粗。
添加一个Discord节点。使用相同的webhook credential。将消息设为{{ $json.message }}。
点击Test step。Discord频道中应出现格式化的博客文章通知。
点击Publish。RSS Feed Trigger现在每30分钟检查feed并将新条目发布到Discord。
链接Error Handler:打开工作流设置,将Error Workflow设为你的Error Handler工作流。再次发布以应用更改。
30分钟后查看Executions标签(或临时将轮询间隔改为1分钟)。你应该看到记录的执行,即使没有新条目(工作流运行但在没有新内容时不产生输出)。
将工作流导出为JSON来备份、分享或在n8n实例之间迁移。
- 打开要导出的工作流。
- 点击三点菜单(⋮)> Download。
- n8n将
.json文件保存到你的电脑。
如果你有n8n容器的shell访问权限,也可以从命令行导出:
docker exec n8n n8n export: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端点。使用Nginx反向代理、TLS和安全头保护n8n
- 用Ollama或Claude为工作流添加AI处理。在VPS上使用Ollama和Claude构建n8n AI工作流
- 阅读完整的在VPS上使用n8n自托管工作流自动化生产加固指南。
- 学习Docker Compose基础知识来管理多服务堆栈。参见[-> docker-compose-multi-service-vps]。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/250236.html