You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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节点,输入以下代码:
    msg.payload = JSONata.version;
    return msg;
    
    部署后触发该节点,在调试面板中即可看到当前Node-RED使用的JSONata版本。

内容的提问来源于stack exchange,提问作者Sebastian Pabst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:15:13