Проблема в том, что отправка большого сериализованного JSON (более 16 000 символов) по сетевому сокету делится на куски. Каждый кусок запускает событие data
на принимающей стороне. Поэтому просто запуск JSON.parse()
по входящим данным может завершиться с ошибкой SyntaxError: Unexpected end of input
.узел - отправить большой JSON поверх сетевого сокета
Работа, с которой мне удалось дойти, заключается в том, чтобы добавить нулевой символ ('\u0000'
) в конец сериализованного JSON и проверить его на принимающей стороне. Вот пример:
var partialData = '';
client.on('data', function(data) {
data = data.toString();
if (data.charCodeAt(data.length - 1) !== 0) {
partialData += data;
// if data is incomplete then no need to proceed
return;
} else {
// append all but the null character to the existing partial data
partialData += data.substr(0, data.length - 1);
}
// pass parsed data to some function for processing
workWithData(JSON.parse(partialData));
// reset partialData for next data transfer
partialData = '';
});
Одной из неудач этой модели, если приемник подключен к нескольким разъемам, и каждый сокет отправки больших файлов в формате JSON.
Причина, по которой я делаю это, заключается в том, что мне нужно передавать данные между двумя процессами, запущенными в одном окне, и я предпочитаю не использовать порт. Следовательно, используя сетевой сокет. Таким образом, было бы два вопроса: во-первых, есть ли лучший способ быстро передать большие данные JSON между двумя процессами Node.js? Во-вторых, если это лучший способ, то как мне лучше обработать случай, когда сериализованный JSON разбивается на куски при отправке?
Любопытный..Что вы хотели бы сделать это через соединение сокетов против HTTP? –
, имеющий один файловый вещатель сокета. Я могу создать много «слушателей», которые захватывают данные, а затем заполняют их (например, отправьте его в базу данных, график в браузере и т. Д.). хотя я открыт для любого метода более надежной отправки данных от одного до многих процессов Node.js. –