将缓冲区转换为JS对象的问题

时间:2016-02-09 08:52:49

标签: javascript json node.js mqtt

我将mosca库用于MQTT代理,this用于MQTT客户端。

客户端代码如下所示:

client.on('connect', function () {
client.subscribe('presence')
var json = {
  someVar: 888,
  someNum: 234 
}
client.publish('presence', JSON.stringify(json));
});

client.on('message', function (topic, message) {
  var json = JSON.parse(message.toString())
  console.log(json.someVar);
  client.end();
});

处理每个已发布消息的代理在此处:

server.on('published', function(packet, client) {
  console.log('Package received:')
  console.log('Published', packet);

  var stringBuf = packet.payload.toString('utf-8')
  console.log('buffer to string:', stringBuf)
  var stringify = JSON.stringify(packet.payload)
  console.log('stringify:',stringify);
  var json = JSON.parse(stringily);
}

buffer to string:的输出如下所示: {"someVar":888,"someNum":234} 哪个应该是有效的json。但每当我尝试访问json-object时(使用JSON.parse()之后),它只返回变量的undefined。

我也试过

var buf = json.data;
console.log('buffer data:', but);

但这只是返回一个缓冲数组,似乎无法转换。

在客户端函数中,我可以轻松地将字符串解析为JS对象,因此我对发生的事情感到有点迷失。

有什么建议吗?感谢。

2 个答案:

答案 0 :(得分:3)

就像 stdob - 所说的那样,你试图解析所有传入的消息,例如你输出的输出:

$scope.nome > $scope.name

您可以检查主题以处理所需的Package received: Published mqttjs_05cac308 Package received: Published {"clientId":"mqttjs_05cac308","topic":"presence"} Package received: Published <Buffer 7b 22 73 6f 6d 65 56 61 72 22 3a 38 38 38 2c 22 73 6f 6d 65 4e 75 6d 22 3a 32 33 34 7d> Package received: Published {"clientId":"mqttjs_05cac308","topic":"presence"} Package received: Published mqttjs_05cac308 消息:

presence

答案 1 :(得分:1)

您收到错误,因为尝试解析所有传入的消息,包括不包含纯JSON数据的服务消息。试试这个:

server.on('published', function(packet, client) {
  console.log('Package received:')
  console.log('Published', packet);

  var stringBuf = packet.payload.toString('utf-8')
  try {
    var json = JSON.parse(stringBuf);
    console.log( json );
  } catch (e) {
    console.log( stringBuf );
  }
}