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

3 分钟阅读·Matthieu|

在自托管实例上从零构建两个实际的n8n工作流。一个通过webhook获取天气数据并发送到Discord,另一个监控RSS并将新文章发布到频道。

你的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使用能力。

什么是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中构建之前,你需要一个发送通知的目标。

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

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

步骤2:添加Webhook触发器节点

点击画布占位符上的**+按钮。搜索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/。这个区别很重要,稍后会详细说明。

步骤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
  • 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响应。

**仔细观察:**看输出面板。响应是嵌套的。当前温度在$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节点。

  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。

步骤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月)开始,编辑器每隔几秒自动保存你的工作。不再有手动保存按钮。

流程如下:

  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标签,确认生产执行已记录。

如何在n8n工作流中处理错误?

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工作流,然后将所有其他工作流链接到它。

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 > Value30 > Unit:Minutes。

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

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

步骤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实例之间迁移。

导出工作流

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

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

docker exec n8n n8n export:workflow --id=<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端点。
  • 用Ollama或Claude为工作流添加AI处理。
  • 阅读完整的生产加固指南。
  • 学习Docker Compose基础知识来管理多服务堆栈。参见用于多服务VPS部署的Docker Compose

Copyright 2026 Virtua.Cloud. All rights reserved.

准备好亲自尝试了吗?

几秒内部署您自己的服务器。支持 Linux、Windows 或 FreeBSD。

查看 VPS 方案
构建n8n工作流:Webhooks、API调用、通知教程