WedX - журнал о программировании и компьютерных науках

Как установить ограничения на количество строк, читаемых потоком nodejs

Я читаю длинный текст csv и передаю клиенту. Мне нужно убедиться, что каждый поток, передаваемый клиенту, имеет связанную с ним метку разрыва строки. Проблема в том, что при потоковой передаче данных разрывы строк удаляются. Есть ли способ, которым я могу гарантировать, что разрывы строк не удалены или заменены некоторыми символами, которые я могу распознать как разрывы строк на стороне клиента «во время» потоковой передачи?

Кроме того, нет гарантии, что каждый буфер в потоке всегда будет заканчиваться точкой разрыва строки, например, если у меня есть данные ниже

10,20,30
40,50,60

Следующий буфер может начинаться с 50 вместо 40. Как узнать, что каждый буфер должен быть объединен с разрывом строки или без него?

серверная часть

app.get('/test/api', (req, res) => {
    let stream = fs.createReadStream('./resources/onescsv.csv');
    stream = byline.createStream(stream);
    stream.on('data', (data)=>{
        // console.log(data.toString());
        res.write(data + '||||')
    });
    // stream.pipe(res);
    stream.on('end', () => res.end());

});

сторона клиента

let count = 0;
    $(document).ready(()=>{
        let lastOfPrevious;
        let firstOfCurrent;
        let xhr = new XMLHttpRequest();
        xhr.open('GET', '/test/api', true);
        xhr.onprogress = function (){
            console.log('line count');
            let incomingBuffer = xhr.responseText;
            console.log(incomingbuffer)
    };
    xhr.send()
});

Спасибо.



Ответы:


1

Я полагаю, что вы передавали очень большие данные csv со своего сервера на клиент, где в клиенте вы не могли определить разрывы строк в передаваемых данных csv.

Очень просто будет использовать встроенный модуль узла «readline», который позволит нам читать потоковые данные построчно. Я добавил ниже фрагмент рабочего кода, чтобы проиллюстрировать это.

stream_server.js

const http = require('http');
const fs = require('fs');
var server = http.createServer(function (req, res) {
    let stream = fs.createReadStream(__dirname + '/tmp.csv');
    stream.pipe(res);
});
server.listen(8000)

stream_client.js

const fs = require('fs');
const http = require('http');
const readline = require('readline');

var options = {
    host: 'localhost',
    port: 8000
  };

http.get(options, function(res) {
    console.log(`Got response:  ${res.statusCode}`);
    let readStream = readline.createInterface({
        input: res,
        output: process.stdout,
        terminal: false
    });
    readStream.on('line', function(line) {
        console.log(`Reading -->  ${line}`);
    });

}).on('error', function(e) {
    console.log(`Got error  ${e.message}`);
});

Надеюсь, это решит вашу проблему.

Я сохранил приведенную выше часть, относящуюся к моему первоначальному пониманию вопроса, с измененной формулировкой вопроса, похоже, что вы добавляли разделитель к каждой строке csv в ответе сервера.

Что ж, если вы определите свой экспресс-маршрут, как показано ниже, он добавит разделитель для каждой строки вашего CSV-файла.

app.get('/test/api', (req, res) => {
    let stream = fs.createReadStream('./tmp.csv');
    let readStream = readline.createInterface({
        input: stream,
        output: process.stdout,
        terminal: false
    });
    readStream.on('line', function(line) {
        console.log(`Reading -->  ${line}`);
        res.write(line + ' |||| ')
    });
    stream.on('end', () => res.end());
});
23.08.2017
  • Я обновил свой вопрос, чтобы проиллюстрировать мою проблему. Я уже пишу в ответ построчно и ожидаю такого же поведения, как и вы. Однако, по-видимому, даже если я стримлю построчно, xhr получает порцию строк за раз 23.08.2017
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]