Node-RED注入节点后如何从返回对象提取指定值作为msg.payload?
Node-RED提取指定字段值实现方案
问题场景
搭建Node-RED流程实现图表输出时,触发注入节点后可获取包含id/s/r/v/t等键值对的返回对象,注入节点输出示例:
{ "readResults": [ { "id": "AB.CMM.Prgm_MainProgram.f_ten_point_avg_left_camber", "s": true, "r": "", "v": 0.0261451192, "t": 1657888956310 } ] }
目标是仅提取键名v对应的数值,赋值给msg.payload输出,例如上述示例最终输出0.0261451192即可。
原有代码错误原因
之前编写的function节点代码如下,无法正常运行:
var newMsg = { payload: msg.payload[5] }; return newMsg;
错误点:
- 错误将
msg.payload当作可按数字索引直接取值的字符串/扁平数组,实际上目标v字段嵌套在readResults数组的子对象中 - 没有考虑部分场景下注入节点输出的payload是JSON字符串格式,需要先解析为JavaScript对象才能按键取值
正确实现代码
将function节点内的代码替换为以下内容即可:
// 兼容payload为JSON字符串/JS对象两种格式 const responseData = typeof msg.payload === 'string' ? JSON.parse(msg.payload) : msg.payload; // 提取目标v值赋值给payload msg.payload = responseData.readResults[0].v; return msg;
扩展适配
如果后续readResults数组返回多条数据,需要提取所有条目对应的v值对接图表,可以将取值逻辑替换为以下写法,输出为所有v值组成的数组:
const responseData = typeof msg.payload === 'string' ? JSON.parse(msg.payload) : msg.payload; msg.payload = responseData.readResults.map(item => item.v); return msg;
部署后可在function节点后连接debug节点,确认输出值符合预期后再对接图表节点即可。
内容的提问来源于stack exchange,提问作者Glenn94
相关产品推荐
相关产品推荐

