Я подключаюсь к внешнему websocket api, используя библиотеку узлов ws (узел 10.8.0 на Ubuntu 16.04). У меня есть слушатель, который просто разбирает 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..
Я тогда подумал; каковы эти персонажи? Увидев структуру, я изначально думал, что первый странный знак должен быть открывающей скобкой массива ([
), а второй - запятой (,
), так что он создает массив объектов.
Затем я исследовал проблему, записывая rawdata
в файл всякий раз, когда он сталкивается с ошибкой синтаксического анализа JSON. Через час или около того он спас около 1500 из этих файлов ошибок, что означает, что это происходит очень часто. Я cat
пару этих файлов в терминале, из которых я загрузил пример ниже:
Здесь интересно несколько вещей:
- Файлы всегда начинаются с одного из этих странных знаков.
- Файлы, как представляется, существуют из нескольких сообщений, которые должны были быть получены отдельно. Странные знаки разделяют эти индивидуальные сообщения.
- Файлы всегда заканчиваются незавершенным json-объектом.
- Файлы имеют разную длину. Они не всегда одинакового размера и, следовательно, не отрезаны на определенной длине.
Я не очень разбираюсь в websockets, но может быть, что мой websocket каким-то образом получает поток сообщений, который он объединяет вместе с этими странными знаками в качестве разделителей, а затем случайным образом отключает последнее сообщение? Может быть, потому, что я получаю постоянный очень быстрый поток сообщений?
Или это может быть из-за ошибки (или функциональности) на стороне сервера в том, что он объединяет эти отдельные сообщения?
Кто-нибудь знает, что здесь происходит? Все советы приветствуются!
[РЕДАКТИРОВАТЬ]
@bendataclear предложил интерпретировать его как utf8. Так я и сделал, и я вставил снимок экрана из результатов ниже. Первая печать такая же, как и есть, а вторая интерпретируется как utf8. Для меня это не похоже. Я мог бы, конечно, преобразовать в utf8, а затем разделить эти символы. Несмотря на то, что последнее сообщение всегда отключено, это, по крайней мере, сделает некоторые из сообщений доступными. Другие идеи по-прежнему приветствуются.