json - 通过 socket.io 传输文本文件的内容会生成 ArrayBuffer 对象

标签 json node.js socket.io

我是 socket.io 的新手,对 node.js 的接触也很少

所以我从简单的聊天应用程序开始,逐步发展

当消息来自另一个客户端时,我可以获取从服务器发送到客户端的短信,就像聊天演示应用程序一样

但是当尝试让服务器读取本地文件并使用 io.emit 发送此内容时,客户端接收到的似乎是 ArrayBuffer 的实例,无论如何都会混淆 JSON 解析器

更具体地说,服务器端是这样的

fs.watch('status.json', 
  function(event, filename){
    fs.readFile('status.json',
      function(err, data){
        if (err) throw err;
      io.emit("r2lab status", data);
      });
  });

客户端会这样做

socket.on('r2lab status', function(json){
    console.log("received JSON nodes_info " + json);
    var nodes_info = JSON.parse(json);
    /* etc.. */

在运行时在控制台中触发此操作

received JSON nodes_info [object ArrayBuffer]
r2lab.html:1 Uncaught SyntaxError: Unexpected token o
...

由于当我通过文件以外的其他来源获取输入时逻辑有效,这一切都强烈表明我从 readFile 中获取的 data 不是一个纯字符串,但某种实例以某种方式使其到达客户端;就像我以二进制或其他方式打开输入文件一样。

有人可以建议一种方法来让 JSON.parse() 满意这种情况吗?服务器端或客户端,任何一种方式对我来说都很好。

非常感谢

最佳答案

您可以使用Uint8Array View 来访问ArrayBuffer,然后将其转换为字符串:

socket.on('r2lab status', function(data){
  var buffer = new Uint8Array(data)
  var fileString= String.fromCharCode.apply(null, buffer)
  var obj = JSON.parse(fileString)
});

关于json - 通过 socket.io 传输文本文件的内容会生成 ArrayBuffer 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32314078/

相关文章:

ios - 如何将 JSONDecoder 与继承/协议(protocol)一起使用?

java - POST 方法中 JSON 中的无关后缀数据

node.js - "path"参数必须是字符串类型。接收类型对象 - Angular 7

javascript - 重新使用 SAML token ,JSON Web 服务的客户端 - 登录网站后

javascript - React hooks,每个状态值一个钩子(Hook)?

javascript - 如何发出get请求来检索elasticsearch集群中某个索引的最新文档?

node.js - socket.ionodejs : use database to store all sockets clients?

javascript - socket.io 服务器对象选项,两者之间有什么影响?

node.js - 在 Symfony2 应用程序中包含 Node.JS + Socket.IO

javascript - 创建 .json 文件的一段代码不起作用