If-Else 控制节点
概述
If-Else 控制节点是工作流系统中的核心控制流组件,允许您根据条件表达式的结果选择不同的执行路径。当条件为真时,执行 true 分支;当条件为假时,执行 false 分支。这种分支控制机制是构建复杂业务逻辑的基础。
核心特性
- ✅ 条件评估: 支持复杂的 JavaScript 条件表达式
- ✅ 安全执行: 在隔离的 VM 沙盒环境中评估条件
- ✅ 数据流传递: 自动传递上游节点的输出数据
- ✅ 动态分支: 根据条件结果动态创建和执行子工作流
- ✅ 类型支持: 支持数值、字符串、布尔值和对象的比较
节点配置
基本配置结构
{
"type": "control",
"config": {
"identifier": "if_else",
"name": "条件判断节点"
},
"metadata": {
"origin": "built-in",
"runtime": { "type": "worker" }
}
}
配置参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
type | string | ✅ | 节点类型,固定为 "control" |
config.identifier | string | ✅ | 控制节点标识符,固定为 "if_else" |
config.name | string | ❌ | 节点显示名称 |
输入输出端口
输入端口
| 端口名 | 类型 | 必填 | 说明 |
|---|---|---|---|
data | any | ✅ | 用于条件判断的数据,通常来自上游节点 |
condition | string | ✅ | 条件表达式(JavaScript 语法) |
输出端口
| 端口名 | 类型 | 说明 |
|---|---|---|
true | any | 条件为真时的数据输出 |
false | any | 条件为假时的数据输出 |
条件表达式语法
If-Else 节点使用 JavaScript 语法编写条件表达式,在安全的 VM 沙盒环境中执行。
基本语法
条件表达式中可以使用以下变量和对象:
data: 输入数据对象inputs: 完整的输入对象context: 工作流执行上下文Math: 数学计算对象Date: 日期处理对象utils: 工具函数集合
支持的运算符
// 比较运算符
data.age > 18 // 大于
data.score >= 90 // 大于等于
data.name === "Alice" // 严格相等
data.status !== "inactive" // 不等于
// 逻辑运算符
data.age > 18 && data.verified === true // 逻辑与
data.type === "VIP" || data.score > 95 // 逻辑或
!(data.blocked === true) // 逻辑非
// 类型检查
typeof data.name === "string"
Array.isArray(data.items)
data.date instanceof Date
// 字符串操作
data.email.includes("@example.com")
data.name.startsWith("Admin")
data.status.toLowerCase() === "active"
工具函数
条件表达式中可以使用内置的工具函数:
// 类型检查
utils.isString(data.name)
utils.isNumber(data.age)
utils.isEmpty(data.description)
// 验证函数
utils.isEmail(data.email)
utils.isURL(data.website)
边连接配置
数据输入边
从上游节点向 If-Else 节点传递数据:
{
"source": "data-processor:result",
"target": "condition-check:data",
"dataPath": ""
}
条件分支边
从 If-Else 节点向下游节点传递结果:
// True 分支
{
"source": "condition-check:true",
"target": "success-handler:parameters",
"dataPath": ""
}
// False 分支
{
"source": "condition-check:false",
"target": "failure-handler:parameters",
"dataPath": ""
}
完整示例
示例 1:用户年龄验证
这个示例展示了如何验证用户年龄并根据结果执行不同的处理逻辑。
工作流配置
{
"nodes": {
"user-data-processor": {
"type": "operator",
"config": {
"identifier": "js-executor",
"name": "用户数据处理器"
}
},
"age-verification": {
"type": "control",
"config": {
"identifier": "if_else",
"name": "年龄验证"
}
},
"adult-handler": {
"type": "operator",
"config": {
"identifier": "js-executor",
"name": "成年人处理器"
}
},
"minor-handler": {
"type": "operator",
"config": {
"identifier": "js-executor",
"name": "未成年人处理器"
}
}
},
"edges": [
{
"source": "user-data-processor:result",
"target": "age-verification:data"
},
{
"source": "age-verification:true",
"target": "adult-handler:parameters"
},
{
"source": "age-verification:false",
"target": "minor-handler:parameters"
}
]
}
节点输入数据
{
"user-data-processor": {
"code": "const user = { name: 'Alice', age: 25, email: 'alice@example.com' }; return user;",
"parameters": {}
},
"age-verification": {
"condition": "data.age >= 18"
},
"adult-handler": {
"code": "return { status: 'approved', message: `欢迎 ${params.name}!您已通过年龄验证。`, userInfo: params };",
"parameters": {}
},
"minor-handler": {
"code": "return { status: 'rejected', message: `抱歉 ${params.name},您的年龄不符合要求。`, userInfo: params };",
"parameters": {}
}
}
执行结果
当用户年龄为 25 时:
- 条件
data.age >= 18评估为true - 执行
adult-handler节点 - 返回批准消息
示例 2:考试成绩评级
这个示例展示了如何根据考试成绩进行等级评定。
条件配置
{
"condition": "data.score >= 90 && data.score <= data.maxScore"
}
数据处理
// 输入数据处理
const exam = {
student: 'Charlie',
subject: 'Math',
score: 92,
maxScore: 100
};
// 条件评估: 92 >= 90 && 92 <= 100 → true
// 执行优秀等级处理逻辑
示例 3:复杂业务条件
// 多条件组合判断
data.userType === "VIP" && data.orderAmount > 1000 && data.region === "premium"
// 嵌套属性判断
data.profile && data.profile.verified === true && data.profile.level > 3
// 数组和字符串操作
data.tags.includes("priority") || data.email.endsWith("@company.com")
数据流处理
数据传递机制
- 上游数据收集: If-Else 节点从连接的上游节点收集输出数据
- 条件评估: 在安全沙盒中执行条件表达式
- 分支选择: 根据条件结果选择 true 或 false 分支
- 数据传递: 将原始输入数据传递给选中的分支节点
数据流示例
┌─────────────────┐ data ┌─────────────┐
│ Data Processor │ ─────────► │ If-Else │
└─────────────────┘ │ Node │
└─────┬───┬───┘
│ │
true │ │ false
▼ ▼
┌─────────┐ ┌─────────┐
│ Success │ │ Failure │
│ Handler │ │ Handler │
└─────────┘ └─────────┘
最佳实践
1. 条件表达式设计
// ✅ 推荐:清晰的条件表达式
data.age >= 18 && data.verified === true
// ❌ 避免:过于复杂的条件
data.age >= 18 && data.verified === true && data.profile && data.profile.settings && data.profile.settings.notifications === "enabled"
// ✅ 推荐:使用工具函数简化
utils.isNumber(data.age) && data.age >= 18
2. 错误处理
// ✅ 安全的属性访问
data && data.user && data.user.age > 18
// ✅ 类型检查
typeof data.score === "number" && data.score >= 60
3. 性能优化
- 避免在条件表达式中执行复杂计算
- 优先检查简单条件,利用短路求值
- 使用工具函数进行常见验证
4. 调试技巧
启用调试模式查看条件评估过程:
// 条件评估日志会显示:
// - 输入数据内容
// - 条件表达式文本
// - 评估结果(true/false)
// - 选择的执行分支
安全特性
VM 沙盒隔离
If-Else 节点在隔离的 VM 环境中执行条件评估,确保:
- ✅ 无法访问系统资源
- ✅ 无法执行危险操作
- ✅ 无法修改全局状态
- ✅ 自动超时保护(5秒)
安全限制
以下操作在条件表达式中被禁止:
// ❌ 禁止的操作
require("fs") // 模块导入
eval("malicious code") // 代码执行
process.exit() // 系统调用
global.something = value // 全局变量修改
故障排除
常见问题
1. 条件始终为 false
症状: 无论输入数据如何,条件总是评估为 false
原因:
- 数据传递配置错误
- 条件表达式语法错误
- 数据类型不匹配
解决方法:
// 检查数据是否正确传递
console.log("输入数据:", data);
// 验证数据类型
typeof data.age === "number"
// 使用安全访问
data && data.age && data.age > 18
2. 分支未执行
症状: If-Else 节点正常工作,但下游分支节点未执行
原因:
- 边连接配置错误
- 节点标识符不匹配
- 数据路径配置问题
解决方法:
- 检查边的 source 和 target 配置
- 确认节点 ID 正确
- 验证数据路径表达式
3. 性能问题
症状: 条件评估耗时过长
原因:
- 条件表达式过于复杂
- 输入数据量过大
- 递归或循环操作
解决方法:
- 简化条件表达式
- 在上游节点预处理数据
- 避免在条件中进行重计算
调试工具
启用详细日志查看执行过程:
{
"condition": "data.age > 18",
"debug": true
}
调试输出示例:
条件评估开始: data.age > 18
输入数据: { name: "Alice", age: 25 }
评估结果: true
选择分支: true
高级用法
条件链
多个 If-Else 节点可以串联实现复杂的条件逻辑:
Input → Age Check → Adult Check → VIP Check → Final Handler
↓ ↓ ↓
Minor Handler Regular Standard
动态条件
条件表达式可以引用上下文中的动态值:
// 引用上下文中的配置
data.score >= context.passingScore
// 使用日期比较
new Date(data.timestamp) > new Date("2024-01-01")