Как можно отслеживать прогресс записи при передаче с Node.js? - PullRequest
0 голосов
/ 09 июля 2019

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

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

const fs = require('fs');
let final = fs.createWriteStream('output');

fs.createReadStream('file')
    .on('close', () => {
        console.log('done');
    })
    .on('error', (err) => {
        console.error(err);
    })
    .on('data', (data) => {
        console.log("data");
        /* Calculate progress */
    })
    .pipe(final);

Однако я понял, что только то, что оно было прочитано, не означает, что оно действительно было написано.Это можно увидеть, если удалить pipe, так как событие data все еще излучает.

Как можно отслеживать запись прогресса при передаче по трубопроводу с Node.js?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Почему-то я помню, что этот поток посвящен эффективности использования памяти, так или иначе, я установил небольшой скрипт, который очень эффективно использует память и отслеживает прогресс очень хорошо.Я проверил это под файлом на 230 МБ, и результат говорит сам за себя.https://gist.github.com/J-Cake/78ce059972595823243526e022e327e4

Образец файла, который я использовал, был немного странным, так как заголовок content-length, о котором он сообщил, фактически отключен, но программа использует не более 4,5 МБ памяти.

0 голосов
/ 09 июля 2019

Вы можете выполнить трубопровод вручную и использовать callback из writable.write ()

callback: <функция> Обратный вызов, когда этот фрагмент данных сбрасывается

const fs = require('fs');

let from_file = `<from_file>`;
let to_file = '<to_file>';

let from_stream = fs.createReadStream(from_file);
let to_stream   = fs.createWriteStream(to_file);

// get total size of the file
let { size } = fs.statSync(from_file);

let written = 0;
from_stream.on('data', data => {
    // do the piping manually here.
    to_stream.write(data, () => {
        written += data.length;
        console.log(`written ${written} of ${size} bytes (${(written/size*100).toFixed(2)}%)`);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...