跳到主要内容

If-Else 控制节点

概述

If-Else 控制节点是工作流系统中的核心控制流组件,允许您根据条件表达式的结果选择不同的执行路径。当条件为真时,执行 true 分支;当条件为假时,执行 false 分支。这种分支控制机制是构建复杂业务逻辑的基础。

核心特性

  • 条件评估: 支持复杂的 JavaScript 条件表达式
  • 安全执行: 在隔离的 VM 沙盒环境中评估条件
  • 数据流传递: 自动传递上游节点的输出数据
  • 动态分支: 根据条件结果动态创建和执行子工作流
  • 类型支持: 支持数值、字符串、布尔值和对象的比较

节点配置

基本配置结构

{
"type": "control",
"config": {
"identifier": "if_else",
"name": "条件判断节点"
},
"metadata": {
"origin": "built-in",
"runtime": { "type": "worker" }
}
}

配置参数说明

参数类型必填说明
typestring节点类型,固定为 "control"
config.identifierstring控制节点标识符,固定为 "if_else"
config.namestring节点显示名称

输入输出端口

输入端口

端口名类型必填说明
dataany用于条件判断的数据,通常来自上游节点
conditionstring条件表达式(JavaScript 语法)

输出端口

端口名类型说明
trueany条件为真时的数据输出
falseany条件为假时的数据输出

条件表达式语法

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")

数据流处理

数据传递机制

  1. 上游数据收集: If-Else 节点从连接的上游节点收集输出数据
  2. 条件评估: 在安全沙盒中执行条件表达式
  3. 分支选择: 根据条件结果选择 true 或 false 分支
  4. 数据传递: 将原始输入数据传递给选中的分支节点

数据流示例

┌─────────────────┐    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")