使用Mosca搭建MQTT服务器时JSON解析报错的解决方法咨询
解决Mosca MQTT消息JSON解析错误的问题
看起来你遇到的SyntaxError是因为拿到的payload字符串并非有效的JSON格式,咱们一步步来排查和解决:
第一步:先搞清楚你拿到的到底是什么内容
错误提示说在位置2有意外的字符c,说明转换后的payloadString根本不是你预期的JSON。先在代码里添加调试打印,看看原始payload的真实模样:
server.on('published', (packet, client) => { let { payload } = packet; if(payload) { console.log('原始payload类型:', typeof payload); console.log('原始payload值:', payload); let payloadString = payload.toString(); console.log('转换后的字符串:', payloadString); // 重点看这个输出 try { let payloadJson = JSON.parse(payloadString); console.log(payloadJson); } catch (err) { console.error('解析错误详情:', err); } } });
运行后你就能看到到底是什么字符串导致了解析失败——大概率是以下几种情况之一:
常见问题和对应解决办法
1. Payload是Buffer但编码转换不明确
Mosca的packet.payload是Buffer类型,默认toString()用的是utf8编码,但如果发送端用了其他编码,或者消息有隐藏字符,就会出问题。
解决办法:明确指定utf8编码,同时去掉字符串前后的空白字符:
payloadString = packet.payload.toString('utf8').trim();
2. 收到了Mosca的系统消息
Mosca的published回调会收到所有消息,包括系统级的消息(比如订阅确认、$SYS开头的主题消息),这些消息的payload往往不是业务JSON,甚至是空的。
解决办法:先过滤掉这些非业务消息:
server.on('published', (packet, client) => { // 过滤空payload和系统主题消息 if (!packet.payload || packet.topic.startsWith('$SYS/')) { return; } try { let payloadString = packet.payload.toString('utf8').trim(); let payloadJson = JSON.parse(payloadString); console.log('解析成功:', payloadJson); // 这里执行存入数据库的逻辑 } catch (err) { console.error('JSON解析失败:', err.message); console.error('出错的消息内容:', payloadString); } });
3. 发送端的消息本身就不是标准JSON
比如发送端没有正确用JSON.stringify()把对象转为字符串,或者消息里有语法错误(比如引号不匹配、逗号多余)。
解决办法:检查发送端代码,确保发送的是经过JSON序列化的字符串,而不是直接发送JS对象。比如发送端应该是:
// 正确示例:先序列化再发送 const message = {_id:"5e928105156c40000006f9e9", temperature:33, humidity:64.9}; client.publish('your/topic', JSON.stringify(message));
最后提醒
用try-catch包裹JSON解析逻辑是个好习惯,这样即使遇到错误消息,也不会导致整个MQTT服务崩溃,还能打印出错误详情方便调试。
内容的提问来源于stack exchange,提问作者EmBeCoRau
相关产品推荐
相关产品推荐

