条件逻辑
学习如何在工作流中使用条件逻辑,让自动化更智能
条件逻辑
条件逻辑是让工作流变得智能的关键。通过条件判断,你可以根据不同的情况执行不同的操作,让自动化流程更加灵活和强大。
🎯 核心概念
IF 节点
IF 节点是 N8N 中最常用的条件判断节点,它可以:
- 根据条件将数据流分成两个分支
- 支持复杂的逻辑表达式
- 处理多种数据类型比较
Switch 节点
Switch 节点适合多分支条件判断:
- 支持多个输出分支
- 可以设置默认分支
- 适合复杂的路由逻辑
📊 IF 节点详解
基本语法
// 基本比较
{{ $json.temperature > 30 }}
// 字符串比较
{{ $json.status === "success" }}
// 数组长度检查
{{ $json.items.length > 0 }}
// 字段存在性检查
{{ $json.email !== undefined }}
比较运算符
运算符 | 说明 | 示例 |
---|---|---|
=== | 严格相等 | {{ $json.status === "active" }} |
!== | 严格不等 | {{ $json.type !== "admin" }} |
> | 大于 | {{ $json.score > 80 }} |
>= | 大于等于 | {{ $json.age >= 18 }} |
< | 小于 | {{ $json.price < 100 }} |
<= | 小于等于 | {{ $json.count <= 10 }} |
逻辑运算符
// AND 逻辑
{{ $json.age >= 18 && $json.status === "active" }}
// OR 逻辑
{{ $json.type === "premium" || $json.score > 90 }}
// NOT 逻辑
{{ !$json.isBlocked }}
// 复合逻辑
{{ ($json.age >= 18 && $json.hasLicense) || $json.isVIP }}
🔄 实战案例:智能客户分类
创建一个根据客户数据自动分类的工作流:
场景描述
根据客户的购买金额、注册时间和VIP状态,自动分配不同的营销策略。
工作流设计
HTTP Webhook → IF(VIP检查) → IF(金额检查) → IF(时间检查) → 发送邮件
步骤一:VIP 状态检查
// IF 节点条件
{{ $json.isVIP === true }}
True 分支:VIP 客户流程 False 分支:普通客户流程
步骤二:购买金额分类
// 高价值客户
{{ $json.totalAmount >= 10000 }}
// 中等价值客户
{{ $json.totalAmount >= 1000 && $json.totalAmount < 10000 }}
// 低价值客户
{{ $json.totalAmount < 1000 }}
步骤三:注册时间判断
// 计算注册天数
{{ Math.floor((new Date() - new Date($json.registerDate)) / (1000 * 60 * 60 * 24)) }}
// 新客户(注册不足30天)
{{ Math.floor((new Date() - new Date($json.registerDate)) / (1000 * 60 * 60 * 24)) < 30 }}
🎛️ Switch 节点进阶
多分支路由示例
// 根据订单状态路由
switch ($json.orderStatus) {
case "pending":
return 0; // 分支 0:待处理
case "processing":
return 1; // 分支 1:处理中
case "shipped":
return 2; // 分支 2:已发货
case "delivered":
return 3; // 分支 3:已送达
default:
return 4; // 分支 4:异常状态
}
按数值范围分类
// 根据分数分等级
const score = $json.score;
if (score >= 90) return 0; // A级
else if (score >= 80) return 1; // B级
else if (score >= 70) return 2; // C级
else if (score >= 60) return 3; // D级
else return 4; // F级
🧮 高级条件表达式
字符串匹配
// 包含检查
{{ $json.email.includes("@gmail.com") }}
// 开头检查
{{ $json.productCode.startsWith("PRO") }}
// 正则表达式匹配
{{ /^[A-Z]{2,3}-\d{4}$/.test($json.orderNumber) }}
// 大小写不敏感匹配
{{ $json.city.toLowerCase() === "beijing" }}
数组操作
// 数组包含检查
{{ $json.tags.includes("urgent") }}
// 数组长度
{{ $json.items.length > 5 }}
// 数组查找
{{ $json.products.find(p => p.category === "electronics") }}
// 数组过滤
{{ $json.orders.filter(o => o.status === "active").length > 0 }}
日期时间条件
// 今天的订单
{{ new Date($json.orderDate).toDateString() === new Date().toDateString() }}
// 工作日检查(周一到周五)
{{ new Date().getDay() >= 1 && new Date().getDay() <= 5 }}
// 营业时间检查(9:00-18:00)
{{ const hour = new Date().getHours(); hour >= 9 && hour < 18 }}
// 月初检查
{{ new Date().getDate() <= 3 }}
🎨 可视化条件设计
使用表达式编辑器
- 点击条件字段旁的表达式图标
- 选择字段:从下拉菜单选择要比较的字段
- 选择操作:选择比较运算符
- 输入值:设置比较的目标值
- 预览结果:查看条件表达式
条件组合技巧
// 复杂业务逻辑示例
{{
// VIP客户或高消费客户
($json.isVIP === true) ||
// 或者消费金额超过5000且评分高于4.5
($json.totalAmount > 5000 && $json.rating > 4.5) ||
// 或者是最近的新客户且完成了首单
(Math.floor((new Date() - new Date($json.registerDate)) / (1000 * 60 * 60 * 24)) < 7 &&
$json.firstOrderCompleted === true)
}}
🔧 最佳实践
1. 条件命名
给复杂条件起有意义的名字:
// 不好的写法
{{ $json.a > 100 && $json.b < 50 }}
// 好的写法
{{
const highValue = $json.amount > 100;
const lowRisk = $json.riskScore < 50;
return highValue && lowRisk;
}}
2. 错误处理
在条件中加入错误处理:
// 安全的字段访问
{{ $json.user?.profile?.age >= 18 }}
// 默认值处理
{{ ($json.score || 0) >= 80 }}
// 类型检查
{{ typeof $json.amount === 'number' && $json.amount > 0 }}
3. 性能优化
避免在条件中进行复杂计算:
// 不好的写法(每次都重新计算)
{{ expensiveCalculation($json.data) > threshold }}
// 好的写法(在前面的Set节点中预先计算)
{{ $json.calculatedValue > threshold }}
📈 实战项目:智能库存预警
需求分析
- 库存低于安全线时发送预警
- 根据商品类别设置不同预警级别
- 工作日和节假日使用不同通知方式
实现方案
1. 数据获取
// 从数据库获取库存数据
SELECT product_id, category, current_stock, safety_stock, is_hot_item
FROM inventory
WHERE current_stock <= safety_stock * 1.2
2. 预警级别判断
// Switch 节点:根据库存紧急程度分类
const stockRatio = $json.current_stock / $json.safety_stock;
const isHotItem = $json.is_hot_item;
if (stockRatio <= 0.2 || (stockRatio <= 0.5 && isHotItem)) {
return 0; // 紧急预警
} else if (stockRatio <= 0.5) {
return 1; // 重要预警
} else {
return 2; // 一般预警
}
3. 通知方式选择
// IF 节点:判断是否为工作时间
const now = new Date();
const isWorkday = now.getDay() >= 1 && now.getDay() <= 5;
const isWorkHour = now.getHours() >= 9 && now.getHours() < 18;
// 工作时间用钉钉,其他时间用邮件
{{ isWorkday && isWorkHour }}
🎯 常见问题
Q: 条件表达式不生效?
A: 检查以下几点:
- 数据类型是否正确(字符串 vs 数字)
- 字段名是否存在拼写错误
- 是否使用了正确的比较运算符
Q: 如何调试复杂条件?
A: 使用以下技巧:
- 在 Set 节点中分步构建条件
- 使用
console.log()
输出中间值 - 在测试模式下查看数据结构
Q: 条件太复杂如何优化?
A: 考虑:
- 将复杂逻辑拆分成多个简单条件
- 使用 Code 节点编写 JavaScript 函数
- 在数据库层面预处理条件
🚀 下一步学习
掌握条件逻辑后,你可以继续学习:
条件逻辑让你的工作流变得真正智能。继续练习和探索,你会发现更多有趣的应用场景!