- 开始使用
- 构建
- 部署并运行
- 示例
- 参考
表达式语法
适用于工作流中的变量、运算符和条件的 JavaScript 表达式语法。
表达式是一小段 JavaScript(一种广泛使用的编程语言),用于读取或计算值。工作流中的表达式引用值带有$vars前缀,用于配置字段、决策和切换条件以及脚本代码。
变量和数据流描述了数据如何在节点之间移动,以及变量的工作方式。
变量引用
您引用的每个值都位于$vars下:
$vars.httpRequest1.output.body // node output
$vars.orderTotal // variable
$vars.manualTrigger1.output.userId // trigger input
$vars.httpRequest1.output.body // node output
$vars.orderTotal // variable
$vars.manualTrigger1.output.userId // trigger input
- 节点输出:
$vars.<nodeName>.output。每个节点都在.output下公开其结果。该对象的形状取决于节点,因此节点引用的每一页都列出了其节点的输出字段。 - 变量:
$vars.<name>。 - 触发器输入:
$vars.<triggerName>.output.<inputName>。
嵌套属性使用点表示法,数组元素使用方括号表示法:
$vars.httpRequest1.output.body.customer.email
$vars.httpRequest1.output.body.items[0].id
$vars.httpRequest1.output.body.customer.email
$vars.httpRequest1.output.body.items[0].id
编写表达式的位置
简而言之,规则:将$vars…直接写入脚本代码、条件和设置为“表达式”的字段中,并将其包含在设置为“固定值”的文本字段内的{{ $vars… }}中。
大多数配置字段可以包含固定值或表达式。字段右端的图标将打开一个菜单,其中包含三个选项:
- 固定值:直接输入值。
- 表达式:编写 JavaScript 表达式。该编辑器提供 IntelliSense,会在您键入时建议名称和属性。在此模式下,该字段会在表达式前显示一个
=。 - 清除值:清空字段。
“字段标签”旁边的“插入”菜单将打开一个可搜索列表,其中包含该节点可用的值。该列表是$vars下的一树,每个节点、其output及其中的字段都有一个条目,并且每个字段都显示其类型,例如string或object 。该列表还有一个$metadata组,其中包含FolderKey 、 InstanceId 、 ProcessKey和ElementCount 。
固定值字段
设置为“固定值”的字段会保存文本。要在文本中嵌入表达式,请从“插入”菜单中选择一个值,该值会将引用包含在双大括号中。编辑器会检查引用,并在字段下方报告问题,例如,当节点的输出中不存在某个属性时:
https://api.example.com/users/{{ $vars.manualTrigger1.output.userId }}
https://api.example.com/users/{{ $vars.manualTrigger1.output.userId }}
表达式字段和脚本代码
设置为“表达式”的字段、“决策”和“切换”条件、 “更新变量”部分和“脚本代码”直接采用表达式,不使用大括号:
$vars.httpRequest1.output.code === 200
$vars.httpRequest1.output.code === 200
在表达式字段中,通过使用+或使用模板字面量来将文本和值结合使用。以下两者产生相同的结果:
"https://api.example.com/users/" + $vars.manualTrigger1.output.userId
`https://api.example.com/users/${$vars.manualTrigger1.output.userId}`
"https://api.example.com/users/" + $vars.manualTrigger1.output.userId
`https://api.example.com/users/${$vars.manualTrigger1.output.userId}`
运算符
支持的标准 JavaScript 运算符:
| 运算符 | 示例 | 结果 |
|---|---|---|
| 平等 | $vars.status === "active" | true 或者 false |
| 不等式 | $vars.count !== 0 | true 或者 false |
| 比较 | $vars.price > 100 | true 或者 false |
| 逻辑与 | $vars.isVerified && $vars.isActive | true 或者 false |
| 逻辑或 | $vars.role === "admin" || $vars.role === "owner" | true 或者 false |
| 三元 | $vars.count > 0 ? "has items" : "empty" | 字符串 |
字符串运算
"Hello, " + $vars.firstName
$vars.message.toUpperCase()
$vars.email.includes("@uipath.com")
"Hello, " + $vars.firstName
$vars.message.toUpperCase()
$vars.email.includes("@uipath.com")
模板字面量将变量和静态文本结合在一起:
`Hello ${$vars.firstName}, your order #${$vars.orderId} has shipped.`
`Hello ${$vars.firstName}, your order #${$vars.orderId} has shipped.`
可选链接
?.运算符可以安全地读取可能未定义的属性:
$vars.httpRequest1.output.body?.items?.[0]?.id
$vars.httpRequest1.output.body?.items?.[0]?.id
如果任何中间属性为 null 或未定义,则结果为undefined ,而不是运行时错误。
空值合并
当值为 null 或“未定义”时, ??运算符提供默认值:
$vars.userName ?? "Anonymous"
$vars.userName ?? "Anonymous"
常见错误
| 症状 | 原因 | 待执行操作 |
|---|---|---|
表达式解析为 undefined | 您在节点运行之前引用了节点的输出,或输出中不存在的字段 | 仅参考来自上游节点的输出;请查看节点的参考页面,了解其实际输出字段。对可能缺失的属性使用可选链接 ( ?. )。 |
| 决策或切换条件行为异常或失败 | 条件不是纯布尔值表达式,例如,可以编写为return语句 | 编写一个解析为true或false明文表达式,例如$vars.order1.output.total > 1000 。不要使用return 。 |
Cannot find name '$vars' (或'$self' ) | 变量不在此节点的作用域内,或者在节点上使用了$self ,而节点本身无法产生输出 | 仅引用该节点的变量选取器中显示的变量。$vars仅解析为作用域内的变量; $self仅适用于生成输出的节点。 |
| 无法引用其他节点的值 | 作用域仅限上游:节点无法查看下游节点、同级分支中的节点或其已退出循环内的节点 | 重组,以便生产节点位于您引用它的位置的上游,或通过作用域内的变量携带该值。 |
$vars.<node>.error 不可用 | 仅当在节点上启用了错误处理(或已连接其错误路径)时,节点的错误输出才在范围内。 | 在节点上启用错误处理,或连接其错误句柄,然后引用$vars.<node>.error 。 |
Failed to evaluate expression =js:(https://...): Unexpected token ':' | 纯值(例如 URL)所在字段设置为“不带引号的表达式” ,因此会被读取为 JavaScript | 将字段切换为“固定值” ,或将文本放入引号中,例如"https://api.example.com/users" 。 |
{{ }} 显示为原义文本,或文本字段无法解析 | 模式不匹配: {{ }}仅适用于设置为“固定值”的字段 | 仅在固定值字段中使用{{ $vars.x }} 。在表达式字段以及“决策”和“切换”条件中,直接写入$vars.x (不带大括号)。 |
决策和切换条件在运行时作为表达式运行。return语句仅在脚本节点代码中有效。
注意
- 表达式在运行时而非设计时求值。执行节点时,会出现语法错误。
- 配置字段中的表达式必须解析为该字段所需的类型。条件字段必须解析为
true或false。 - 表达式字段会在表达式前面显示一个
=,以标记表达式模式。.flow文件中显示的=js:前缀是内部序列化格式,您永远不会在编辑器中输入它。 - 类型检查不完整。对没有固定结构的输出的引用未完全验证,因此嵌套字段名称中的拼写错误可能会在没有警告的情况下通过。将嵌套路径与节点引用中列出的输出字段进行比较。