【发布时间】:2019-01-13 04:58:32
【问题描述】:
我正在使用node ws library(Ubuntu 16.04 上的节点 10.8.0)连接到外部 websocket api。我有一个侦听器,它只是解析 json 并将其传递给回调:
this.ws.on('message', (rawdata) => {
let data = null;
try {
data = JSON.parse(rawdata);
} catch (e) {
console.log('Failed parsing the following string as json: ' + rawdata);
return;
}
mycallback(data);
});
我现在收到rawData 如下所示的错误(我已格式化并删除了不相关的内容):
�~A
{
"id": 1,
etc..
}�~�
{
"id": 2,
etc..
然后我想知道;这些字符是什么?看到这个结构,我最初认为第一个奇怪的符号必须是数组的左括号([),第二个是逗号(,),这样它就创建了一个对象数组。
然后我通过在遇到 JSON 解析错误时将 rawdata 写入文件来进一步调查该问题。在一个小时左右的时间里,它已经保存了大约 1500 个这样的错误文件,这意味着这种情况经常发生。我在终端中cated 了几个这样的文件,我在下面上传了一个示例:
这里有几件事很有趣:
- 文件总是以这些奇怪的符号之一开头。
- 文件似乎存在于应分别接收的多条消息中。奇怪的标志将这些单独的信息分开。
- 文件总是以未完成的 json 对象结尾。
- 文件的长度不同。它们的大小并不总是相同,因此不会在特定长度上被切断。
我对 websockets 不是很有经验,但可能是我的 websocket 以某种方式接收到它连接在一起的消息流,这些奇怪的符号作为分隔符,然后随机切断最后一条消息?也许是因为我不断收到非常快的消息流?
或者可能是因为服务器端的错误(或功能)将这些单独的消息组合在一起?
有人知道这里发生了什么吗?欢迎所有提示!
[编辑]
@bendataclear 建议将其解释为 utf8。所以我做到了,并在下面粘贴了结果的屏幕截图。第一个打印是原样,第二个解释为utf8。对我来说,这看起来没什么。我当然可以转换为 utf8,然后按这些字符分割。尽管最后一条消息总是被切断,但这至少会使一些消息可读。不过仍然欢迎其他想法。
【问题讨论】:
-
由于 JSON 应该使用 UTF(8、16 或 32)之一进行编码,因此正确解码输入可能是个好主意。但是,这些位置的预期字符都属于 UTF-8 的 ASCII 子集,所以我怀疑解码会帮助您解决这个特殊问题。
-
�~ 字符是“替换字符”,因此如果您看到此问题,再修复它已经太晚了。您可以尝试使用 utf8 模块(
npm install utf8)转换为 utf8,然后转换字符串(utf8.encode(string))吗? -
@bendataclear - 我尝试将结果添加到上述问题中。这会给你任何提示吗?
-
@kramer65 - 看起来这是通过其他一些编码(二进制?),您使用的是标准节点 websocket 客户端(
require('websocket').client)吗? -
@bendataclear - 不,我正在使用 ws 库:github.com/websockets/ws。我也在考虑二进制,但为什么呢?以及如何处理它?我在基于那个奇怪的字符串的 utf8 转换后尝试了拆分,但令我惊讶的是,这似乎不起作用。还有其他想法吗?
标签: javascript json node.js websocket stream