场景导入:别让你的自动化流程变成“数据垃圾场”
笔者在 N8N大学 混迹多年,见过太多新手同学把 n8n 用成了“数据搬运工”。当你直接把 HTTP Request 节点的响应扔给下一个节点时,你其实在埋雷。
API 返回的数据往往像俄罗斯套娃,层层嵌套;HTTP 状态码更是个“变色龙”,200、201、429、500 混杂在一起。如果你不懂得如何“优雅”地过滤和处理这些数据,你的自动化流程要么在某个节点突然崩溃,要么悄无声息地吞掉错误。
今天,作为你的引路人,笔者将带你手撕 n8n Filter 节点,教你如何精准提取嵌套数据,并冷静应对各种状态码。这不仅仅是技术操作,更是工程思维的升级。
核心实操:三步搞定数据清洗与状态拦截
在 n8n 的世界里,Filter 节点不是简单的开关,它是你工作流的“安检员”。我们以一个常见的场景为例:请求一个分页列表 API,数据藏在深层,且需要分辨成功与否。
第一步:理解 Filter 节点的逻辑引擎
不同于其他工具的简单布尔判断,n8n 的 Filter 节点允许你编写 JavaScript 表达式。这是它的灵魂所在。
在节点配置中,你会看到“Rules”区域。你可以添加多个条件,逻辑关系可以是 AND(与)或 OR(或)。对于复杂的数据处理,笔者建议直接使用 JS 表达式 模式,它能处理更复杂的逻辑。
第二步:优雅地挖掘嵌套数据
假设 API 返回如下结构:
{ "code": 200, "data": { "list": [ { "id": 1, "name": "Test" } ] } }
你的目标是提取 data.list。如果你直接在 HTTP Request 后面接一个 Set 节点,可能会遇到 undefined 的尴尬。
操作步骤:
- 在 HTTP Request 节点后添加 Filter 节点。
- 将 Filter 的 Keep(保留)设置为 Items Matching Condition。
- 在表达式框中输入:
{{ $json.data.list.length > 0 }}。 - 这确保了只有当列表不为空时,流程才继续。这一步避免了空数据污染后续流程。
如果你需要将嵌套的数组“打平”(Flatten),可以使用 Set 节点配合 {{ $json.data.list }} 作为输出,或者使用 Split Out 节点。但在 Filter 阶段,我们主要做的是“存在性验证”。
第三步:基于状态码的路由与拦截
这是处理 API 响应最关键的一步。很多 API 返回 200 OK,但 body 里却写着 {"error": "Something went wrong"}。我们需要区分“HTTP 状态”和“业务状态”。
1. 拦截 HTTP 错误状态码:
n8n 的 HTTP Request 节点有一个设置叫 Full Response。开启后,你可以获取到 statusCode。
在 Filter 节点中,我们可以这样写:
{{ $json.statusCode === 200 }}
如果条件不满足,n8n 默认会走红色的“False”出口。你可以连接一个 Email 节点或 Slack 节点来报警。
2. 拦截业务错误码:
回到上面的例子,业务码在 body 里:
{{ $json.code === 200 }}
如果业务码不是 200,我们可以利用 Filter 的多出口特性(True/False),将错误数据导向一个清理节点,或者直接终止流程。
笔者的实战技巧: 将“HTTP 429 限流”单独处理。在 Filter 中判断 $json.statusCode === 429,如果成立,不要直接失败,而是连接一个 Wait 节点等待 10 秒,然后重试。这能极大提升流程的稳定性。
避坑指南:这些细节让你少走弯路
在 N8N大学 的社区里,关于 Filter 节点的吐槽通常集中在以下两点:
- 数据类型陷阱: n8n 的表达式非常灵活,但全等(===)和双等(==)的区别依然致命。如果你的 API 返回
"code": "200"(字符串) 却用=== 200(数字) 判断,结果永远是 False。记得用Number($json.code) === 200或者直接比较字符串。 - 空值报错: 当你访问深层嵌套属性如
$json.data.list[0].id时,如果list是空的,表达式会报错。务必使用可选链操作符:$json.data?.list?.[0]?.id。这能保护你的流程不因数据缺失而崩溃。
FAQ 问答:你可能遇到的疑惑
Q1: Filter 节点会删除数据吗?
A: 不会。它只是决定数据流的走向。被过滤掉的数据会从“False”出口流出,你可以连接其他节点处理它们,而不是直接丢弃。
Q2: 我想同时判断多个条件,怎么写?
A: 在表达式中使用逻辑运算符。例如:{{ $json.statusCode === 200 && $json.data.list.length > 0 }}。这表示只有 HTTP 成功且列表不为空才继续。
Q3: 如果 API 返回的 JSON 结构不固定怎么办?
A: 这是 API 对接的常见问题。在 Filter 之前,可以加一个 Function 节点,用 JS 代码给缺失的字段赋默认值(如 null 或空数组),然后再进入 Filter 逻辑。这能强制统一数据结构。
总结与资源
处理 API 响应时,Filter 节点是你最可靠的守门员。它不仅能过滤噪音,还能通过多出口逻辑实现复杂的错误处理和重试机制。记住,健壮的自动化不在于流程跑得多快,而在于面对异常数据时能有多稳。
如果你想深入学习 n8n 的更多高级技巧,欢迎访问 N8N大学 (n8ndx.com)。这里没有枯燥的文档复读,只有硬核的实战经验。保持探索,保持自动化。