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

Node-RED中Function node提取JSON值并设置自定义MQTT Topic

Node-RED Function节点生成带自定义Topic的多消息解决方案

问题确认:输出消息是否包含Topic?

你看到调试面板只展示payload是误解——你的示例代码已经给每条消息设置了topic字段,只是Node-RED默认调试输出仅显示payload内容。

验证方法:

  • 点击调试节点的设置图标
  • 将「输出」选项改为完整消息
  • 重新触发消息,即可看到每条消息的topic字段

自定义Topic设置方法

方法1:统一前缀格式(如sensor/+字段名)

修改Function节点代码,在生成topic时添加固定前缀,同时修正原代码的返回格式问题:

var keys = Object.keys(msg.payload);

var msgs = keys.map(function(key) {
    return { 
        topic: `sensor/${key}`, 
        payload: msg.payload[key],
        qos: msg.qos, // 可选:继承原消息的QoS设置
        retain: msg.retain // 可选:继承原消息的Retain设置
    };
});
return msgs; // 注意:直接返回数组即可,无需嵌套在[]中

原代码return [msgs]会导致消息数组被额外嵌套,修正后才能正确生成7条独立消息

方法2:个性化Topic映射(不同字段对应不同Topic)

如果需要给特定字段设置专属Topic,可通过映射对象实现:

// 定义字段与自定义Topic的对应关系
var topicMap = {
    Vbat_Per: "sensor/battery_percent",
    Vbat: "sensor/battery_voltage",
    Fixed: "sensor/fixed_status",
    TemperatureAM: "sensor/outdoor_temp",
    HumidityAM: "sensor/outdoor_humidity",
    TempInside: "sensor/indoor_temp",
    Pressure: "sensor/atmospheric_pressure"
};

var msgs = Object.keys(msg.payload).map(function(key) {
    return { 
        topic: topicMap[key] || `sensor/${key}`, // 无映射时用默认前缀兜底
        payload: msg.payload[key],
        qos: msg.qos,
        retain: msg.retain
    };
});
return msgs;

后续使用

修改代码后,将Function节点的输出连接到7个MQTT节点,每个MQTT节点可直接使用消息自带的topic(无需手动配置),也可根据需求单独覆盖Topic设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:35:23