为何MQTT.js会将JSON消息解析为Uint8Array类型?
MQTT.js 将特定JSON消息解析为Uint8Array的原因及解决方法
这个问题我之前也碰到过,大概率是编码不匹配或者消息处理逻辑的默认行为导致的,咱们一步步拆解:
可能的原因
- UTF-8转码失败:你的消息里包含
\u00c9这类Unicode转义字符,虽然看起来是合法的,但如果发送方实际发送的payload不是标准UTF-8编码(比如用了其他编码格式,或者消息在传输中出现了字节损坏),MQTT.js会无法自动将二进制payload转换成字符串,转而返回原始的Uint8Array。 - MQTT.js默认配置限制:MQTT.js在处理消息时,只有当它能确定payload是合法UTF-8字符串时,才会自动转成字符串类型。如果payload包含一些边缘字符(或者发送方是以二进制格式发送的JSON),库会默认保留二进制形式。
- 消息不完整:你提供的消息末尾是
windBea...,看起来是截断状态。不完整的JSON结构也会干扰MQTT.js的自动解析逻辑,导致它放弃转字符串,返回原始二进制数据。
解决方法
1. 手动转换Uint8Array为字符串再解析
不管自动解析是否生效,你都可以手动处理payload:
client.on('message', (topic, payload) => { // 把Uint8Array转成UTF-8字符串 const payloadStr = Buffer.from(payload).toString('utf8'); try { const data = JSON.parse(payloadStr); console.log('解析后的JSON:', data); } catch (err) { console.error('JSON解析失败:', err); } });
2. 订阅时明确指定编码
在订阅主题时,显式设置encoding参数强制转成UTF-8字符串:
client.subscribe('external/forecast', { encoding: 'utf8' }, (err) => { if (!err) { console.log('订阅成功'); } });
3. 检查发送方的消息发送逻辑
确认发送方是将JSON以UTF-8字符串形式发送,而不是以二进制字节流发送。比如在Mosquitto的发布命令里,要确保没有用二进制模式发送。
4. 验证消息完整性
检查这条消息在发送时是否被完整传输,截断的消息不仅会导致解析失败,也会触发MQTT.js返回原始二进制数据。可以用MQTT客户端工具(比如MQTTX)订阅该主题,查看完整的消息内容是否符合JSON格式。
内容的提问来源于stack exchange,提问作者WoJ
相关产品推荐
相关产品推荐

