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
相关产品推荐
相关产品推荐

