Switch 控制节点
概述
Switch控制节点是一个多分支条件处理节点,根据表达式计算结果将数据路由到不同的分支执行。它支持复杂的条件判断和多种匹配模式,是实现复杂业务逻辑分支的核心控制节点。
节点配置
基本属性
{
"id": "switch-1",
"type": "control",
"config": {
"identifier": "switch",
"title": "条件分支器",
"description": "多分支条件处理"
}
}
输入参数
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
data | Object/Any | ✅ | 输入数据,用于表达式计算 |
expression | String | ✅ | 条件表达式,支持JavaScript表达式 |
cases | Array | ✅ | 分支案例数组,每个案例包含value和port |
defaultCase | Object | ❌ | 默认分支,当没有匹配的case时执行 |
分支案例结构
{
"cases": [
{
"value": "A", // 匹配值
"port": "gradeA" // 输出端口名
},
{
"value": ["VIP", "GOLD"], // 支持数组匹配
"port": "premium"
}
],
"defaultCase": {
"port": "default" // 默认端口
}
}
表达式计算
Switch节点使用ConditionEvaluator来计算表达式,支持:
基本表达式
// 简单属性访问
"data.score"
"data.user.level"
// 数值比较
"data.score >= 90"
"data.amount > 1000"
// 字符串匹配
"data.status === 'active'"
"data.type"
复合表达式
// 三元运算符
"data.score >= 90 ? 'A' : data.score >= 80 ? 'B' : 'C'"
// 逻辑运算
"data.amount > 1000 && data.customer.vip"
"data.type === 'URGENT' || data.priority === 'HIGH'"
// 复杂条件组合
"data.amount > 1000 && data.customer.vip ? 'VIP_LARGE' : data.type === 'URGENT' ? 'URGENT' : 'NORMAL'"
匹配模式
Switch节点支持三种匹配模式:
1. 精确匹配
{
"cases": [
{ "value": "A", "port": "excellent" },
{ "value": "B", "port": "good" },
{ "value": 90, "port": "highScore" }
]
}
2. 字符串匹配(忽略大小写)
{
"cases": [
{ "value": "pending", "port": "waitingHandler" },
{ "value": "RUNNING", "port": "activeHandler" }
]
}
// "PENDING" 和 "pending" 都会匹配到 waitingHandler
3. 数组包含匹配
{
"cases": [
{ "value": ["DIAMOND", "PLATINUM", "GOLD"], "port": "premium" },
{ "value": ["SILVER", "BRONZE"], "port": "standard" }
]
}
// data.level 为 "GOLD" 时会匹配到 premium 端口
上下文管理
Switch节点会在上下文中保存执行结果:
// 上下文结构
context['switch-1'] = {
[matchedPort]: inputData, // 匹配的端口对应的数据
'_switch_result': {
expression: "data.score >= 90 ? 'A' : 'B'",
expressionValue: "A", // 表达式计算结果
matchedCase: "A", // 匹配的案例值
matchedPort: "gradeA" // 匹配的端口名
}
}
使用示例
示例1:成绩评级系统
{
"nodes": {
"score-processor": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "const student = { name: '张三', score: 95, subject: '数学' }; return student;"
}
},
"grade-switch": {
"type": "control",
"config": {
"identifier": "switch"
}
},
"excellent-handler": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { result: 'excellent', message: `恭喜${parameters.name}!成绩优秀(${parameters.score}分)`, grade: 'A' };"
}
},
"good-handler": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { result: 'good', message: `${parameters.name}成绩良好(${parameters.score}分)`, grade: 'B' };"
}
},
"pass-handler": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { result: 'pass', message: `${parameters.name}成绩及格(${parameters.score}分)`, grade: 'C' };"
}
},
"fail-handler": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { result: 'fail', message: `${parameters.name}成绩不及格(${parameters.score}分)`, grade: 'D' };"
}
}
},
"edges": [
{
"source": "score-processor",
"target": "grade-switch",
"sourcePort": "result",
"targetPort": "data"
},
{
"source": "grade-switch",
"target": "excellent-handler",
"sourcePort": "gradeA",
"targetPort": "parameters"
},
{
"source": "grade-switch",
"target": "good-handler",
"sourcePort": "gradeB",
"targetPort": "parameters"
},
{
"source": "grade-switch",
"target": "pass-handler",
"sourcePort": "gradeC",
"targetPort": "parameters"
},
{
"source": "grade-switch",
"target": "fail-handler",
"sourcePort": "default",
"targetPort": "parameters"
}
],
"inputs": {
"grade-switch": {
"expression": "data.score >= 90 ? 'A' : data.score >= 80 ? 'B' : data.score >= 60 ? 'C' : 'D'",
"cases": [
{ "value": "A", "port": "gradeA" },
{ "value": "B", "port": "gradeB" },
{ "value": "C", "port": "gradeC" }
],
"defaultCase": { "port": "default" }
}
}
}
示例2:客户等级服务分派
{
"nodes": {
"customer-analyzer": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "const customer = { id: 'C001', name: '张总', level: 'DIAMOND', region: 'CN', spending: 50000 }; return customer;"
}
},
"service-router": {
"type": "control",
"config": {
"identifier": "switch"
}
},
"vip-service": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { type: 'premium_service', message: `尊敬的${parameters.name},您享受VIP专属服务`, level: parameters.level, benefits: ['专属客服', '优先处理', '特殊折扣'] };"
}
},
"standard-service": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { type: 'standard_service', message: `亲爱的${parameters.name},感谢您的支持`, level: parameters.level, benefits: ['标准服务'] };"
}
},
"basic-service": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { type: 'basic_service', message: `${parameters.name},欢迎使用我们的服务` };"
}
}
},
"edges": [
{
"source": "customer-analyzer",
"target": "service-router",
"sourcePort": "result",
"targetPort": "data"
},
{
"source": "service-router",
"target": "vip-service",
"sourcePort": "premium",
"targetPort": "parameters"
},
{
"source": "service-router",
"target": "standard-service",
"sourcePort": "standard",
"targetPort": "parameters"
},
{
"source": "service-router",
"target": "basic-service",
"sourcePort": "default",
"targetPort": "parameters"
}
],
"inputs": {
"service-router": {
"expression": "data.level",
"cases": [
{ "value": ["DIAMOND", "PLATINUM", "GOLD"], "port": "premium" },
{ "value": ["SILVER", "BRONZE"], "port": "standard" }
],
"defaultCase": { "port": "default" }
}
}
}
示例3:订单处理分派
{
"nodes": {
"order-classifier": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "const order = { id: 'O001', amount: 1500, type: 'URGENT', priority: 'HIGH', customer: { vip: true } }; return order;"
}
},
"order-switch": {
"type": "control",
"config": {
"identifier": "switch"
}
},
"vip-order-handler": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { type: 'vip_large_order', message: `VIP大额订单 ${parameters.id} 优先处理`, amount: parameters.amount, fast_track: true };"
}
},
"urgent-order-handler": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { type: 'urgent_order', message: `紧急订单 ${parameters.id} 加急处理`, priority: parameters.priority };"
}
},
"normal-order-handler": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { type: 'normal_order', message: `订单 ${parameters.id} 正常处理` };"
}
}
},
"edges": [
{
"source": "order-classifier",
"target": "order-switch",
"sourcePort": "result",
"targetPort": "data"
},
{
"source": "order-switch",
"target": "vip-order-handler",
"sourcePort": "vipLarge",
"targetPort": "parameters"
},
{
"source": "order-switch",
"target": "urgent-order-handler",
"sourcePort": "urgent",
"targetPort": "parameters"
},
{
"source": "order-switch",
"target": "normal-order-handler",
"sourcePort": "normal",
"targetPort": "parameters"
}
],
"inputs": {
"order-switch": {
"expression": "data.amount > 1000 && data.customer.vip ? 'VIP_LARGE' : data.type === 'URGENT' ? 'URGENT' : 'NORMAL'",
"cases": [
{ "value": "VIP_LARGE", "port": "vipLarge" },
{ "value": "URGENT", "port": "urgent" },
{ "value": "NORMAL", "port": "normal" }
]
}
}
}
示例4:状态机处理
{
"nodes": {
"task-monitor": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "const task = { id: 'task-001', status: 'pending', priority: 'high' }; return task;"
}
},
"status-router": {
"type": "control",
"config": {
"identifier": "switch"
}
},
"pending-handler": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { result: 'pending_handled', message: `任务${parameters.id}等待处理`, nextStatus: 'running' };"
}
},
"running-handler": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { result: 'running_handled', message: `任务${parameters.id}正在执行`, progress: 50 };"
}
},
"completed-handler": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { result: 'completed_handled', message: `任务${parameters.id}已完成`, completedAt: new Date().toISOString() };"
}
},
"error-handler": {
"type": "operator",
"config": {
"operator": "jsexecutor",
"code": "return { result: 'error_handled', message: `任务${parameters.id}状态异常`, needsReview: true };"
}
}
},
"edges": [
{
"source": "task-monitor",
"target": "status-router",
"sourcePort": "result",
"targetPort": "data"
},
{
"source": "status-router",
"target": "pending-handler",
"sourcePort": "pending",
"targetPort": "parameters"
},
{
"source": "status-router",
"target": "running-handler",
"sourcePort": "running",
"targetPort": "parameters"
},
{
"source": "status-router",
"target": "completed-handler",
"sourcePort": "completed",
"targetPort": "parameters"
},
{
"source": "status-router",
"target": "error-handler",
"sourcePort": "default",
"targetPort": "parameters"
}
],
"inputs": {
"status-router": {
"expression": "data.status",
"cases": [
{ "value": "pending", "port": "pending" },
{ "value": "running", "port": "running" },
{ "value": "completed", "port": "completed" }
],
"defaultCase": { "port": "default" }
}
}
}
错误处理
表达式计算失败时的回退机制
// 1. 首先尝试使用ConditionEvaluator计算表达式
// 2. 如果失败,尝试将表达式作为属性名从inputData中获取值
// 3. 最后回退到直接使用表达式本身作为值
无匹配分支时的处理
// 如果没有匹配的case且没有defaultCase,返回null,不执行任何分支
if (!matchedPort) {
console.log('没有匹配的分支需要执行');
return null;
}
最佳实践
1. 表达式设计建议
// ✅ 推荐:清晰的逻辑结构
"data.score >= 90 ? 'A' : data.score >= 80 ? 'B' : 'C'"
// ✅ 推荐:组合多个条件
"data.amount > 1000 && data.customer.vip"
// ✅ 推荐:简单属性访问
"data.status"
"data.user.level"
2. 分支设计模式
// 分级处理模式
{
"cases": [
{ "value": ["LEVEL_1", "LEVEL_2"], "port": "highLevel" },
{ "value": ["LEVEL_3", "LEVEL_4"], "port": "midLevel" },
{ "value": ["LEVEL_5"], "port": "lowLevel" }
],
"defaultCase": { "port": "defaultLevel" }
}
// 状态机模式
{
"cases": [
{ "value": "INIT", "port": "initialize" },
{ "value": "PROCESSING", "port": "process" },
{ "value": "COMPLETE", "port": "finalize" }
],
"defaultCase": { "port": "error" }
}
3. 调试技巧
// 在子工作流中访问Switch的决策信息
const processor = `
const switchResult = context['switch-1']._switch_result;
console.log('Switch决策信息:', {
expression: switchResult.expression,
value: switchResult.expressionValue,
matchedCase: switchResult.matchedCase,
port: switchResult.matchedPort
});
return {
processed: parameters,
decision: switchResult
};
`;
4. 性能优化
// 将最常用的case放在前面
{
"cases": [
{ "value": "COMMON_STATUS", "port": "commonHandler" }, // 90%的情况
{ "value": "RARE_STATUS", "port": "rareHandler" }, // 10%的情况
{ "value": "VERY_RARE", "port": "specialHandler" } // 1%的情况
]
}
重要说明:Switch节点作为纯控制节点,根据条件选择执行路径后会停止主工作流的后续执行,所有的业务逻辑都在选中的分支子工作流中完成。