You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js使用ws库连接WebSocket收到非JSON数据如何转为可读格式

问题解答

1. 收到的数据类型

你收到的是Node.js 内置的Buffer(二进制缓冲区)类型,ws库默认配置下,当服务端返回二进制WebSocket帧时,就会将消息体封装为Buffer对象返回,你打印出来的结构就是Buffer对象的原生表示,Uint8Contents字段存储的是原始二进制字节内容。

2. 转换为可读格式的方法

2.1 优先尝试转UTF-8字符串

大部分场景下服务端返回的二进制内容只是UTF-8编码的文本,直接调用toString()方法即可转换,参考修改后的onmessage回调代码:

client.onmessage = (event) => {
  const data = event.data;
  // 先判断是否为Buffer类型
  if (Buffer.isBuffer(data)) {
    // 转换为UTF-8编码字符串
    const textContent = data.toString('utf8');
    console.log("字符串格式内容:", textContent);
    
    // 适配当前请求场景:你发送的消息前缀带了42,是对接Socket.IO服务的标识,可补充逻辑解析JSON
    try {
      // 匹配Socket.IO协议的数字前缀
      const prefixMatch = textContent.match(/^\d+/);
      if (prefixMatch) {
        const jsonStr = textContent.slice(prefixMatch[0].length);
        const jsonData = JSON.parse(jsonStr);
        console.log("解析后的JSON数据:", jsonData);
      }
    } catch (parseErr) {
      console.log("JSON解析失败,原始字符串内容为:", textContent, "错误信息:", parseErr.message);
    }
  } else {
    console.log("非二进制消息:", data);
  }
};

2.2 转字符串后为乱码的处理方案

如果转UTF-8后输出乱码,说明服务端返回的是结构化二进制编码数据(常见的有Protobuf、MessagePack等),你需要找服务端提供对应的编码规则,引入对应格式的解码库处理即可。

3. 额外优化建议

从你发送的消息前缀42判断,你对接的应该是Socket.IO协议的服务,这种场景不建议直接用原生ws库开发,直接使用官方的socket.io-client库可以自动处理协议前缀、帧类型适配、重连等逻辑,大幅降低开发成本。


内容的提问来源于stack exchange,提问作者ryeea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:24:04