JSONata 1.8.6与2.0.3版本Transform Operator变量绑定异常及Node-RED版本查询
问题:JSONata Transform Operator内联变量赋值的版本差异及Node-RED JSONata版本查询
背景
业务依赖JSONata的Transform Operator根据产品库龄调整价格,需计算每个产品的库龄、推导折扣率并得出新价格。此前通过Transform Operator结合内联变量赋值处理库存一直正常,但近期使用链式操作符搭配内联变量赋值时出现异常。
在测试环境中验证了以下情况:
测试数据
[ { "a": 1 }, { "a": 2 } ]
查询语句
$ ~> | $ | { "b": $c := a, "c": $c } |
不同JSONata版本的返回结果
- 1.3.3及更早版本:报错(早期版本不支持相关语法,符合预期)
- 1.4.1至1.8.6版本:返回预期结果
[ { "a": 1, "b": 1, "c": 1 }, { "a": 2, "b": 2, "c": 2 } ]
- 2.0.3版本:返回非预期结果
[ { "a": 1, "b": 1 }, { "a": 2, "b": 2, "c": 1 } ]
问题1:版本差异导致异常的原因
这是JSONata 2.x版本对变量作用域和Transform Operator执行逻辑的调整导致的:
- 在1.x版本中,Transform Operator处理数组每个元素时,内联变量
$c属于当前元素的局部作用域,每个元素处理时都会重新赋值,保证变量隔离。 - 在2.x版本中,内联变量
$c被提升到整个Transform操作的顶层作用域。第一个元素处理时$c赋值为1,第二个元素处理时,b字段重新执行$c := a(赋值为2),但c字段引用的$c是顶层作用域中未更新的旧值1;同时第一个元素的c字段因顶层变量未完成赋值,最终没有生成,导致非预期结果。
本质是2.x版本优化了变量作用域规则,内联变量不再自动绑定到当前处理元素的上下文,打破了1.x版本的元素级变量隔离逻辑。
问题2:查询Node-RED Change节点使用的JSONata版本
有两种实用方法:
- 方法1:通过编辑器菜单查看
打开Node-RED编辑器,点击右上角菜单按钮(三条横线),选择「About Node-RED」,在弹出窗口中查看「JSONata」对应的版本号。 - 方法2:通过函数节点查询
添加一个Function节点,输入以下代码:
部署后触发该节点,在调试面板中即可看到当前Node-RED使用的JSONata版本。msg.payload = JSONata.version; return msg;
内容的提问来源于stack exchange,提问作者Sebastian Pabst
相关产品推荐
相关产品推荐

