【问题标题】:How to add an object to the Node-RED msg.payload如何将对象添加到 Node-RED msg.payload
【发布时间】:2018-08-25 08:00:42
【问题描述】:

我需要 Accel 对象作为有效负载对象的一部分:

  • msg.payload.Accel.x:1
  • msg.payload.Accel.y : 2
  • msg.payload.Accel.z : 3

如何将 Accel 和 x,z,y 添加到有效负载,最好使用更改节点?

我已经试过了:

msg.payload.Accel['x'] = 1;
return msg;

得到一个错误:

"TypeError: Cannot set property 'x' of undefined"

【问题讨论】:

    标签: node-red


    【解决方案1】:

    如果 payload 已经是一个对象,你可以使用 Change 节点在 payload 中添加或修改属性,如下所示:

    [{"id":"a5a26aa9.8e0c48","type":"change","z":"b46a495a.46a938","name":"","rules":[{"t":"set","p":"payload.Accel.x","pt":"msg","to":"1","tot":"num"},{"t":"set","p":"payload.Accel.y","pt":"msg","to":"2","tot":"num"},{"t":"set","p":"payload.Accel.z","pt":"msg","to":"3","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":260,"wires":[["85a0573d.ed8788","e0cc9521.5adb38"]]}]
    

    如果有效负载以字符串(或其他非对象)的形式出现,并且您想使用 Change 节点将有效负载作为对象输出,则首先必须使用规则将 msg.payload 设置为空 JSON 对象,然后进一步规则将 msg.payload.Accel.x 设置为 1 等:

    [{"id":"a5a26aa9.8e0c48","type":"change","z":"b46a495a.46a938","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"{}","tot":"json"},{"t":"set","p":"payload.Accel.x","pt":"msg","to":"1","tot":"num"},{"t":"set","p":"payload.Accel.y","pt":"msg","to":"2","tot":"num"},{"t":"set","p":"payload.Accel.z","pt":"msg","to":"3","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":260,"wires":[["85a0573d.ed8788","e0cc9521.5adb38"]]}]
    

    如果负载以字符串(或其他非对象)的形式出现,并且您希望使用 Change 节点将负载作为对象输出,并另外将旧负载内容保留为新负载对象的属性,那么您在将有效负载更改为对象之前,必须先使用规则将原始有效负载存储在临时变量中:

    [{"id":"a5a26aa9.8e0c48","type":"change","z":"b46a495a.46a938","name":"","rules":[{"t":"set","p":"temp","pt":"msg","to":"payload","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"{}","tot":"json"},{"t":"set","p":"payload.Accel.x","pt":"msg","to":"1","tot":"num"},{"t":"set","p":"payload.Accel.y","pt":"msg","to":"2","tot":"num"},{"t":"set","p":"payload.Accel.z","pt":"msg","to":"temp","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":260,"wires":[["85a0573d.ed8788","e0cc9521.5adb38"]]}]
    

    【讨论】:

      【解决方案2】:

      这完全取决于msg.payload 的开头。如果函数节点的输入是一个字符串,那么msg.payload 将是一个字符串,你不能只是给它添加任意属性。

      如果输入已经是一个对象,那么它可以被扩展,但是你需要在对象中创建中间层才能添加值。例如假设以下输入msg.payload

      {
        foo: 25,
        bar: 'testing'
      }
      

      要添加Accel.x,您首先需要添加Accel 键,然后再尝试向Accel.x 添加值。使用功能节点,您可以这样做:

      msg.payload.Accel = {};
      msg.payload.Accel.x = 1;
      msg.payload.Accel['y'] = 2;
      return msg;
      

      使用更改节点,它看起来像这样,因为更改节点将为您添加空层:

      【讨论】:

      • 如果负载以字符串形式出现,您仍然可以使用 Change 节点将其更改为对象。为此,从 Setmsg.payload 到 JSON{} 的规则开始,然后使用第二条规则设置 msg.payload.Accel.x 等。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      相关资源
      最近更新 更多