- 简介
- 入门指南
- 使用 BPMN 进行流程建模
- 使用 Case Management 进行流程建模
- 使用 Flow 进行流程建模
- 流程实施
- 流程运营
- 流程监控
- 流程优化
- 参考信息
数据如何通过节点输出和变量在节点之间流动,以及子流和分支的作用域规则。
内容概览
Flow 中的节点不会自动共享数据。当节点生成输出(如 HTTP 响应或计算值)时,下游节点通过表达式显式访问该输出。变量和数据流决定了您在节点之间连接数据以及在整个流程中保留值的方式。
数据在流程中移动的方式有两种:
- 节点输出— 每个节点都产生下游节点可以引用的输出
- 变量— 您定义的用于在节点之间存储和传递值的流程级变量
有关完整的表达式语法、运算符以及如何编写$vars引用,请参阅表达式语法。
工作方式
节点输出
每个生成数据的节点都通过$vars.<nodeName>.output提供数据。节点名称是根据节点类型自动分配的,例如,第一个 HTTP 请求节点名为httpRequest1 ,第二个节点为httpRequest2 。
选中节点后,您可以在属性面板中看到节点的变量名称。
// Access HTTP Request response
$vars.httpRequest1.output.body
$vars.httpRequest1.output.statusCode
// Access Script return value
$vars.script1.output
// Access a second HTTP Request
$vars.httpRequest2.output.body
// Access HTTP Request response
$vars.httpRequest1.output.body
$vars.httpRequest1.output.statusCode
// Access Script return value
$vars.script1.output
// Access a second HTTP Request
$vars.httpRequest2.output.body
输出结构取决于节点类型。有关其特定输出形状,请参阅每个节点的参考页面。
变量
变量是在单次执行期间保留的流程级值。您可以在属性面板的“变量”选项卡中定义它们。
每个变量都包含:
- 名称— 在表达式中引用的方式(例如
$vars.orderTotal) - 类型— 字符串、数字、布尔值、对象或数组
- Direction — 输入、输出或双向
何时使用变量与节点输出:
- 节点输出适合从一个节点传递到下一个节点的数据。这是最常见的模式。
- 变量必须包含可在整个流程中访问的值,或定义流程本身的输入和输出的值。
清晰地命名变量:带有连字符或驼峰式命名法的描述性小写名称(例如customerEmail 、 invoiceTotal 、 apiResponse )随着时间的推移,会在执行追踪记录中保持清晰。单字母名称和缩写很快就会失去意义。
触发器输入
输入变量归其触发器所有,而不是流程所有。当触发器触发时,其输入可用作$vars.<triggerName>.output.<inputName> :
// Access an input defined on a Manual Trigger named "manualTrigger1"
$vars.manualTrigger1.output.userId
// Access an input defined on a Manual Trigger named "manualTrigger1"
$vars.manualTrigger1.output.userId
这适用于所有触发器类型。如果您的流程有多个触发器,则每个触发器都拥有自己的输入,下游节点会引用开始执行的特定触发器。
变量定义
变量定义位于属性面板的“变量”选项卡中。每个定义都存储变量名称、类型和方向,以便在运行期间以一致的方式引用值。
变量更新
变量可以通过节点配置或脚本节点输出进行更新。
从任何节点 — 更新变量部分
每个节点在属性面板中都有一个“更新变量”部分。该部分存储可写变量目标(输出或双向方向)以及分配给该变量的 JavaScript 表达式。系统将在节点完成后评估表达式。
从“脚本”节点 — 返回值
下游可以将脚本节点的返回值访问为$vars.<scriptName>.output 。“脚本”节点还具有与其他节点相同的“更新变量”部分,用于直接变量写入:
// The return value becomes $vars.script1.output
return {
orderTotal: $vars.httpRequest1.output.body.price * $vars.httpRequest1.output.body.quantity
};
// The return value becomes $vars.script1.output
return {
orderTotal: $vars.httpRequest1.output.body.price * $vars.httpRequest1.output.body.quantity
};
作用域规则
节点可以访问来自以下位置的输出:
- 同一作用域中的上游节点— 在其之前执行的同一级别的节点
- 父容器节点— 如果节点位于子流或循环内,则它可以访问父项的作用域
节点无法访问来自以下位置的输出:
- 不同分支中的节点— 如果决策或切换将执行发送至不同路径,则这些节点的输出不可用
- 尚未执行的节点— 输出仅在节点运行后存在
子流范围
子流创建自己的变量作用域。子流内的节点可以访问:
- 同一子流中的其他节点
- 父流程的作用域
在子流内更新的变量具有命名空间,以避免与父流程冲突。例如,名为subflow1的子流中的变量counter从子流外部被引用为$vars.subflow1.counter 。
父流程可以以$vars.<subflowName>.output形式访问子流的返回值。
并行分支
并行分支具有独立的执行上下文。在一个分支内变更变量不会使该更改在另一个分支中可见。当路径需要重新连接时,“合并”节点会合并来自并行路径的输出。
模式
构建动态字符串
“脚本”节点中的模板字面量结合了变量和静态文本:
return `Hello ${firstName}, your order #${orderId} has shipped.`;
return `Hello ${firstName}, your order #${orderId} has shipped.`;
在循环中累积值
累加器模式使用在“循环”节点之前初始化并附加到循环主体内部的数组:
// Script node inside the Loop body
results.push(item.processedValue);
return results;
// Script node inside the Loop body
results.push(item.processedValue);
return results;
不要将密码值写入日志
密码变量值在用户界面中处于掩码状态,但可能会出现在导出的追踪数据中。将它们记录下来存在数据泄露风险。
实际示例
从 API 中获取用户并根据用户角色进行路由的流程:
步骤 1 — HTTP 请求( httpRequest1 ):GET https://api.example.com/users/42
步骤 2 — 脚本( script1 ):提取用户角色
const user = $vars.httpRequest1.output.body;
return {
name: user.name,
role: user.role,
isAdmin: user.role === "admin"
};
const user = $vars.httpRequest1.output.body;
return {
name: user.name,
role: user.role,
isAdmin: user.role === "admin"
};
步骤 3 — 决策( decision1 ):管理员状态分支
表达式: $vars.script1.output.isAdmin === true
- True → 授予管理员访问权限
- False → 授予标准访问权限