Node.js中MQTT消息解析问题:无法获取Shelly开关state值
解决Shelly MQTT消息中带冒号键的state提取问题
排查方向与解决步骤
确认消息已转为JSON对象
大概率是你拿到的MQTT消息还是原始字符串,没做JSON解析。先把payload转为字符串再解析成JavaScript对象,否则msgObject.params不是真正的对象,自然找不到input:0键:client.on('message', (topic, payload) => { // 先完成字符串转JSON对象的步骤 const msgObject = JSON.parse(payload.toString()); // 再尝试获取state值 const switchState = msgObject.params?.["input:0"]?.state; console.log(switchState); });验证键名的准确性
直接打印msgObject.params的所有键,确认input:0是否存在,避免键名拼写错误(比如是不是写成了inputs:0):console.log("Params下的所有键:", Object.keys(msgObject.params));用可选链操作符做防御性处理
即使键不存在,也不会抛出TypeError,而是返回undefined,方便后续判断:const state = msgObject.params?.["input:0"]?.state; if (state !== undefined) { console.log("当前开关状态:", state); } else { console.log("未找到目标状态值,请检查消息结构"); }
完整可运行示例
const mqtt = require('mqtt'); const client = mqtt.connect('mqtt://你的MQTT broker地址'); client.on('connect', () => { client.subscribe('shellyplus1-08b61fd9e540/events'); }); client.on('message', (topic, payload) => { try { const msgObject = JSON.parse(payload.toString()); const switchState = msgObject.params?.["input:0"]?.state; if (switchState !== undefined) { console.log(`Shelly开关状态: ${switchState}`); } else { console.log("无法获取开关状态,完整消息结构如下:"); console.log(msgObject); } } catch (err) { console.error("解析MQTT消息失败:", err); } });
内容的提问来源于stack exchange,提问作者Jörg jogypilot
相关产品推荐
相关产品推荐

