表达式
表达式是 Atomemo 中强大的数据处理工具,允许你在工作流中动态访问、转换和处理数据。
什么是表达式?
表达式是用于访问和操作工作流数据的特殊语法。通过表达式,你可以:
- 访问节点数据 - 引用任何节点的输出数据
- 转换数据 - 使用内置方法处理数组、字符串、数字等
- 动态计算 - 执行数学运算和逻辑判断
- 组合数据 - 将多个数据源合并为新的输出
基本语法
访问节点数据
在 Atomemo 中,表达式必须明确指定节点名称:
javascript
// 访问节点输出
$('Chat Trigger').message
$('HTTP Request').body.userId
$('Entity Recognition').productName
// 在字符串中使用表达式
`用户 ${$('Chat Trigger').userId} 的订单状态: ${$('HTTP Request').body.status}`重要: 表达式语法始终需要指定节点名称,不支持 $json.field 这样的简写。
表达式上下文
表达式可以在以下地方使用:
- 节点参数 - 任何支持表达式的输入字段
- 条件判断 - IF 节点的条件表达式
- 代码节点 - 在 JavaScript/Python 代码中访问数据
- HTTP 请求 - 动态构建 URL、headers、body
数据类型与方法
Atomemo 表达式引擎为不同的数据类型提供了丰富的内置方法:
数组 (Arrays)
处理数组数据的方法,包括过滤、转换、聚合等操作。
javascript
// 示例
$('HTTP Request').body.items.first()
$('HTTP Request').body.prices.average()
$('HTTP Request').body.users.pluck('name')布尔值 (Booleans)
布尔值转换和操作方法。
javascript
// 示例
$('HTTP Request').body.isActive.toInt()日期 (Dates)
日期时间处理方法,包括格式化、计算、比较等。
javascript
// 示例
$('Chat Trigger').timestamp.format('yyyy-MM-dd')
$('HTTP Request').body.createdAt.plus(7, 'day')数字 (Numbers)
数字运算和转换方法。
javascript
// 示例
$('HTTP Request').body.price.round(2)
$('HTTP Request').body.count.isEven()对象 (Objects)
对象操作方法,包括合并、过滤、转换等。
javascript
// 示例
$('HTTP Request').body.user.hasField('email')
$('HTTP Request').body.config.merge({ newKey: 'value' })字符串 (Strings)
字符串处理方法,包括格式化、解析、验证等。
javascript
// 示例
$('Chat Trigger').message.toUpperCase()
$('HTTP Request').body.email.isEmail()
$('HTTP Request').body.url.extractDomain()常见用例
1. 访问嵌套数据
javascript
// 访问深层嵌套的对象属性
$('HTTP Request').body.user.profile.address.city
// 访问数组元素
$('HTTP Request').body.items[0].name
$('HTTP Request').body.items[1].price2. 数据转换
javascript
// 将字符串转换为数字
$('Chat Trigger').message.toInt()
// 将日期格式化
$('HTTP Request').body.createdAt.format('yyyy-MM-dd HH:mm:ss')
// 将对象转换为 JSON 字符串
$('HTTP Request').body.toJsonString()3. 条件判断
javascript
// 检查值是否存在
$('HTTP Request').body.email.isNotEmpty()
// 检查数字范围
$('HTTP Request').body.age > 18
// 检查日期范围
$('HTTP Request').body.createdAt.isInLast(7, 'day')4. 数组操作
javascript
// 获取数组长度
$('HTTP Request').body.items.length
// 提取特定字段
$('HTTP Request').body.users.pluck('email')
// 过滤数组
$('HTTP Request').body.items.filter(item => item.price > 100)
// 数组聚合
$('HTTP Request').body.prices.sum()
$('HTTP Request').body.scores.average()5. 字符串拼接
javascript
// 使用模板字符串
`您好,${$('HTTP Request').body.user.name}!`
// 拼接多个值
`订单 ${$('HTTP Request').body.orderId} 状态:${$('HTTP Request').body.status}`最佳实践
1. 使用清晰的节点命名
javascript
// 好的做法 - 节点名称清晰
$('Get User Info').body.name
$('Query Orders').body.items
// 不好的做法 - 节点名称不清晰
$('HTTP Request').body.name
$('HTTP Request 1').body.items2. 处理可能不存在的数据
javascript
// 使用可选链操作符
$('HTTP Request').body?.user?.email
// 提供默认值
$('HTTP Request').body.user.name || 'Anonymous'
// 检查是否存在
$('HTTP Request').body.user.hasField('email')3. 避免过于复杂的表达式
javascript
// 好的做法 - 分步处理
// 在代码节点中处理复杂逻辑,然后在其他节点中引用结果
$('Process Data').result
// 不好的做法 - 过于复杂
$('HTTP Request').body.items.filter(item => item.price > 100).pluck('name').join(', ')4. 使用类型转换
javascript
// 确保数据类型正确
$('Chat Trigger').message.toInt()
$('HTTP Request').body.isActive.toBoolean()
$('HTTP Request').body.timestamp.toDate()5. 测试表达式
在开发工作流时:
- 使用代码节点中的
console.log()测试表达式 - 在节点执行后检查输出数据
- 使用表达式编辑器的预览功能验证结果
错误处理
常见错误
节点不存在
javascript// 错误:引用不存在的节点 $('Nonexistent Node').data // 解决:确保节点名称正确 $('HTTP Request').data属性不存在
javascript// 错误:访问不存在的属性 $('HTTP Request').body.nonexistentField // 解决:使用可选链或检查 $('HTTP Request').body?.nonexistentField $('HTTP Request').body.hasField('nonexistentField')类型错误
javascript// 错误:在字符串上调用数字方法 $('Chat Trigger').message.round() // 解决:先转换类型 $('Chat Trigger').message.toInt().round()
调试技巧
1. 使用代码节点调试
javascript
// 在代码节点中打印表达式结果
console.log('User data:', $('HTTP Request').body.user);
console.log('Item count:', $('HTTP Request').body.items.length);
return $('HTTP Request').body;2. 分步验证
将复杂表达式拆分为多个步骤,在每个步骤验证结果:
HTTP Request Node
→ Code Node (验证和转换数据)
→ IF Node (条件判断)
→ Answer Node (返回结果)3. 使用表达式编辑器
表达式编辑器提供:
- 语法高亮
- 自动完成
- 实时预览
- 错误提示
性能考虑
1. 避免重复计算
javascript
// 不好 - 重复计算
`${$('HTTP Request').body.items.length} items, total: ${$('HTTP Request').body.items.sum()}`
// 好 - 在代码节点中计算一次,然后引用
$('Calculate Stats').summary2. 限制数组大小
处理大型数组时要注意性能:
javascript
// 对于大数组,考虑先过滤再处理
$('HTTP Request').body.items
.filter(item => item.active)
.slice(0, 100)
.pluck('name')