掌握你的第一个魔法
现代魔法编程思想
n8n 使用教程
n8n 实战案例
杂项
🔂常用的逻辑(条件、循环等)节点详细介绍
type
status
date
slug
summary
tags
category
icon
password
author
标签
第三方接入
对于学习编程来说,不管是任何语言,首先需要学习的就是逻辑与判断。
尽管 n8n 舍弃了编码的过程,但对于制作 Workflow 来说,本质上仍然是在用图形化进行编程,因此你需要用到一系列逻辑节点。
在 n8n 中,逻辑节点被归类在 Flow 类目下,也就是流程控制。
它支持以下 9 种流程控制节点:
名字 | 说明 |
Filter | 过滤,从上游输入的一堆 items 里过滤掉不满足条件的。 |
If | 判断,根据上游输入的数据判断给出 ture 和 false 结果,并将数据流分叉成两个。 |
Loop Over Items | 循环,将上游输入的一堆 items 中的每一个,运行一遍 loop 中的部分,当所有 items 运行完毕之后,将所有运行结果打包输出给下游。 |
Merge | 合并,将两个上游输出的数据合并成一个。 |
Compare Datasets | 比较,将两个上游输出的数据进行比较,并决定在什么情况下用哪一个输出给下有。 |
Execute Workflow | 执行另一个 Workflow |
Stop and Error | 停止 Workflow 并输出错误 |
Switch | 路由,可以理解为 If 的进阶版,根据上游输入的数据进行多重判断,并依据结果将数据流分叉成多个。 |
Wait | 等待,运行到这里暂停一会儿,主要用于向第三方 API 发起请求时避免超过对方访问限制。 |
流程控制节点一般来说非常简单,如果你能理解它所对应的逻辑本身,你在看完这个表之后应该已经知道如何用了。
如果你此前没有过任何编程经验,下面我们将通过四个实际的例子来来讲解 If、Switch、Merge、Loop 四个 n8n 中最常用的逻辑控制节点。
案例1:我有一张数据表,其中一列是文章标题,我希望在后续的 Workflow 中对包含“评论”的内容单独处理,我该如何操作?(IF 节点用法)
解释:
在这个 case 中,我们使用了 If 节点,使用它来判断标题中是否存在“评论”两个字。
整个 Workflow 首先从给定的 Google Sheets 中读取所有数据,然后在 If 节点里,我们添加了一个 Conditions(条件),这个 Condition 是以
{{ $json['标题'] }}
为判断源,如果它 contains(包含)“评论”二字,就返回 true,否则就返回 false。在 Output 面板,我们可以看到后续 Workflow 被分为了 True Branch(85 个 item)和 False Branch(2710 个 item)。
测试运行后,回到编辑器页面,我们会看到,对应 True Branch 的 85 个数据被分流到了上面的分叉,False Branch 的分流到了下面的分叉,方便我们可以做后续不同的处理。
- If 的 Conditions 有好多种逻辑,支持字符串、数字、日期与时间、布朗、数组和对象字段类型的判断,这里只做最简单的介绍。对应的判断逻辑你可以在需要的时候自行尝试,或在 n8n 官方文档中查阅。
- If 支持多个 Conditions 之间用 AND(且)与 OR(或)连接。比如你可以在一个 If 中设置它判断“包含评论”且“包含高质量”,或者实质它判断“包含评论”或“包含高质量”。
案例2:我有一张数据表,其中一列是文章标题,我希望在后续的 Workflow 中对“包含评论”、“包含高质量”、”包含要闻“的内容分别单独处理,我该如何操作?(Switch 节点用法)
经过 If 的学习,你应该会意识到,这个案例中的判断,其实可以通过设置多层 If 来实现。比如先处理包含评论的,再处理包含高质量的,最后再处理包含要闻的。但这样会增加 Workflow 的复杂程度,还会降低它的运行效率。因此,在面临这种需要处理两个以上分叉路径的逻辑时,我们就可以用更复杂的 Switch 来处理。
Switch 节点支持你添加多个判断逻辑,它会根据每个判断逻辑将匹配的数据送往对应的分叉。可以看到,在我们运行之后,数据流被分为了三叉,分别是标题里有评论的,标题里有高质量的和标题里有要闻的。
在默认情况下,Switch 节点遵循串联的判断模式,也就是它会按照你在参数页面配置路由规则的上下顺序,从上到下判断。一条数据如果已经被匹配到了分叉 1,它就不会再出现在分叉 2 里,哪怕它也符合分叉 2 的判断逻辑。
如果,你需要 Switch 节点在各路由规则之间采用并联方式判断,那么你需要在 Options 里开启 Send data to all matching outputs。这样的话,一条数据在同时满足分叉 1 和分叉 2 的情况下,它就会同时出现在两个分叉里。
案例3:我从数据表中筛选出了对“包含评论”、“包含高质量”和”包含要闻“的内容,我现在分别对他们的数据处理已经完成,现在希望把它们合并回一个数据流写进库里,怎么办?(Merge 节点用法)
在这里,我们需要使用 Merge 节点。
由于 Merge 节点一次只能合并两个分叉,所以我们要合并两次,先合并两个,再将第三个与已经合并后的分叉进行合并。
由于我们的三个分叉出来的数据流在 表头(属性) 上是一致的,因此我们可以直接选择 Append 作为合并模式。
Merge 节点支持三种合并模式,官方文档给出了详细的解释,直接看图会更加清晰:
简答来说:
Append - 直接将分叉 2 的数据加在分叉 1 的后面,适用于表头 表头(属性) 完全一致的两个分叉合并。
Combine - 将分叉 2 与分叉 1 同一索引的不同表头(属性)合并到一起,比如:分叉 2 里有姓名和年龄,分叉 1 里有姓名和性别,通过 Combine,你就能获得一个包含姓名、年龄和性别的数据表。
Merge by Position - 按分叉 2 和分叉 1 的数据位置,直接把两个数据强加在一起。适用范围比较窄,我想不到啥用处。
案例4:从多个 RSS 处获取内容怎么办?(Loop 节点用法)
n8n 中支持 Loop Over Items 节点来创造一个循环。但是,在大部分情况下你不需要该节点来创造循环。
哈哈,是不是被绕晕了?
事情是这样的,当我们在日常编程的时候,我们如果需要对一个数据表中的每一行进行处理,我们首先想到的是需要构造一个循环,但对于 n8n 来说它考虑到了这种常见用法,因此许多 n8n 中的节点是内置循环的。
比如,上游节点传来了一个包含 10 行包含 URL 的数据表,你在当前节点想用 RSS Read 读取这 10 个 RSS 地址里的内容,你实际上不需要用到 Loop Over Items。在默认情况下,当你就将一个数组变量拖动到当前节点的时候,当前节点就会将数组变量中的每一行都执行一遍:
如果你想让某个节点在处理某个数组变量里的值时,只运行一次,你需要在节点的 Settings 页面打开 Execute Once 选项。
n8n 节点中的内置循环,甚至包含了依据条件结束循环,你只需要这样连接一个 If 节点即可:
在这个官方示例中,If 的 Ture 分叉被指回了 Twitter 节点的输入端。而 If 节点中的判断条件为:
这意味着,在 Twitter 节点被运行到第 5 次时,节点会进入 false 分叉结束循环。
这个示例 Workflow 的结果是,会自动在 Twitter 上发送 5 遍 Hello from n8n!
但是,在一些特殊的情况下(比如想要分批处理),我就想用 Loop 来构造循环怎么办?
在这个 Workflow 中,我们就添加了一个 Loop Over Items,它会将上游传递过来的 URL,分批次循环执行 RSS Read。当所有的批次执行完毕之后,数据被合并推送到 done 分叉,执行后续的循环外操作。
与直接用 RSS Read 内置循环的区别是,在这里我将 Loop Over Items 的 Batch Size 参数设置为了 10。这意味着,它会首先将上游传递过来的数据,拆分成 10 行一包,每次只向循环中的 RSS Read 发送 10 包。这时,如果我在循环内加一个 Wait 节点,并且设置为 Wait 1 分钟,就可以有效的控制每分钟只对 10 个 RSS 地址发起请求,拉长请求间隔,避免被对方服务器封禁。
根据官方说明,建议使用 Loop Over Items 的场景有:
- 分批处理数据,以控制 Workflow 的性能消耗;
- 你十分确定输入进来的数据有时会导致节点运行错误,你希望在某一行运行错误的情况下,剩下的行依然能继续处理;
- 你希望控制数据处理的频度,以保障第三方 API 可以正常运行。
在这些官方场景之外,我们还发现一种情况下需要使用 Loop 节点,比如你需要创建两个或两个以上列的交叉组合引用。关于这个场景的用法,你可以阅读:《如何实现一个n*m循环?》
广告
Loading...
Last update: 2024-06-17
🎉简单易懂的现代魔法 1.0 已经上线🎉
-- 感谢您的支持 ---
👏欢迎体验低代码的魅力👏