构建你的第一个n8n工作流:Webhooks、API调用和通知

构建你的第一个n8n工作流:Webhooks、API调用和通知你的 VPS 上已经运行了 n8n 接下来做什么 在本教程中 你将从零构建两个实际的工作流 不是那种把数据发送到虚空的玩具示例 这些是你会持续运行的自动化流程 天气 webhook 接收 HTTP 请求 调用 wttr in 天气 API 格式化响应 然后发送到 Discord 频道 RSS 监控 定时检查博客的 RSS feed 将新文章发布到 Discord 两个工作流在构建过程中涵盖了 n8n 的核心概念

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。



你的VPS上已经运行了n8n。接下来做什么?

在本教程中,你将从零构建两个实际的工作流。不是那种把数据发送到虚空的玩具示例。这些是你会持续运行的自动化流程:

  1. 天气webhook:接收HTTP请求,调用wttr.in天气API,格式化响应,然后发送到Discord频道。
  2. RSS监控:定时检查博客的RSS feed,将新文章发布到Discord。

两个工作流在构建过程中涵盖了n8n的核心概念:节点(nodes)、连接(connections)、表达式(expressions)、n8n 2.0的草稿/发布系统以及错误处理。

前提条件:

  • VPS上有一个正在运行的n8n实例。如果还没有,请先阅读在VPS上使用Docker Compose安装n8n。
  • 一个可以创建webhook的Discord服务器(或Slack工作区。操作步骤可互换;这里使用Discord)。
  • 基本的终端和curl使用能力。

节点是工作流中的单个步骤。每个节点做一件事:接收触发器、发起HTTP请求、转换数据或发送消息。连接是节点之间的连线,将数据从一个节点的输出传递到下一个节点的输入。每个工作流都是从左到右连接的节点链。

本教程中使用的节点类型:

节点 用途 Webhook 监听传入的HTTP请求并启动工作流 HTTP Request 调用外部API并返回响应 Set 创建或重组数据字段 If 根据条件对工作流进行分支 Discord 通过webhook向Discord频道发送消息 RSS Feed Trigger 轮询RSS feed,当出现新条目时触发 Error Trigger 捕获工作流故障并运行通知工作流

在浏览器中打开你的n8n实例。在Workflows页面点击Add workflow。n8n会显示一个空白画布和一个触发器节点占位符。

第一个工作流的功能:通过HTTP webhook接收城市名称,从wttr.in获取当前天气,格式化结果,然后发布到Discord频道。

在n8n中构建之前,你需要一个发送通知的目标。

  1. 打开你的Discord服务器。右键点击你想接收天气更新的频道。
  2. 选择编辑频道 > 集成 > Webhooks
  3. 点击新建Webhook。命名为n8n Weather Bot
  4. 点击复制Webhook URL。保存这个URL。格式类似:https://discord.com/api/webhooks//abcDEF...

把这个URL当作密码对待。任何拥有它的人都能在你的频道中发消息。

点击画布占位符上的+按钮。搜索Webhook并选择它。

配置webhook:

  • HTTP Method:POST
  • Pathweather

其余保持默认。path使你的webhook URL唯一。将path设为weather后,你的webhook URL为:

  • 测试URLhttps://your-n8n-domain.com/webhook-test/weather
  • 生产URLhttps://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
  • URLhttps://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_conditiontemp_CweatherDesc等字段的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节点。

  1. Connection Type设为Webhook
  2. Credential for Discord下,点击Create New Credential
  3. 将步骤1中的Discord webhook URL粘贴到Webhook URL字段。点击Save
  4. Operation设为Send a Message
  5. 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是最常见的模式。

你在上面已经做过了。关键点如下:

测试URL 生产URL 路径格式 /webhook-test/ /webhook/ 何时激活 仅在编辑器中点击"Listen for test event"或"Execute workflow"时 仅在 发布工作流后 在编辑器中显示数据 是,在节点输出面板中实时显示 否(查看Executions标签) 使用场景 构建和调试 正式的外部集成

开发期间始终使用测试URL。它让你实时看到数据流经每个节点。生产URL仅在发布工作流后才有效。

n8n 2.0将保存和激活分开了。你的编辑保持在草稿状态,在你明确发布之前不会影响线上版本。从n8n 2.4(2026年1月)开始,编辑器每隔几秒自动保存你的工作。不再有手动保存按钮。

流程如下:

  1. 你使用测试URL构建和测试工作流。n8n随时自动保存。
  2. 你的更改仅存在于草稿中。线上版本(如果有的话)继续不变地运行。
  3. 你点击Publish。现在生产URL已激活,工作流在触发时自动运行。
  4. 如果你之后编辑工作流,更改将保持在草稿状态直到你再次发布。

在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。这仅适用于已发布的、自动触发的执行。手动测试执行不会触发它。

  1. 回到Workflows页面。点击Add workflow。命名为Error Handler
  2. 添加一个Error Trigger节点作为触发器。当关联的工作流失败时,此节点自动接收错误数据。
  3. 在Error Trigger后添加一个Discord节点。
  4. 使用之前创建的Discord webhook credential配置它。
  5. 将消息设为:
⚠️ Workflow failed: {{ $json.workflow.name }} Error: {{ $json.execution.error.message }} Execution ID: {{ $json.execution.id }} 
  1. 错误工作流自动激活,因为它包含Error Trigger节点。不需要单独发布。

  1. 打开你的Weather Webhook工作流。
  2. 点击右上角的三点菜单(⋮),然后点Settings
  3. Error Workflow下,选择你刚创建的Error Handler工作流。
  4. 点击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 > Value30 > Unit:Minutes。

这每30分钟检查一次feed是否有新条目。RSS Feed Trigger会记住它已经看过哪些条目。首次运行时输出所有当前条目。之后只输出新条目。

点击Fetch Test Event获取当前feed条目。你应该看到包含titlelinkcontentSnippetisoDatecreator字段的条目。

添加一个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实例之间迁移。

  1. 打开要导出的工作流。
  2. 点击三点菜单(⋮)> Download
  3. n8n将.json文件保存到你的电脑。

如果你有n8n容器的shell访问权限,也可以从命令行导出:

docker exec n8n n8n export:workflow –id= 
  
    
    
      –output=/tmp/workflow.json 
    

  1. 在Workflows页面,点击三点菜单 > Import from file
  2. 选择你的.json文件。
  3. 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]。

小讯
上一篇 2026-03-28 23:47
下一篇 2026-03-28 23:45

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/250236.html