Событие readableStream 'data' не генерируется, если поток не передан заранее - PullRequest
1 голос
/ 13 мая 2019

Я использую библиотеку promise-ftp Node.js для загрузки файла с FTP-сервера. Функция ftpClient.get(...) возвращает Promise of ReadableStream, данные которого должны быть доступны с использованием data и end events, однако я сталкиваюсь со странным поведением, которое не описано в документации.

//Some code that returns a to-be-downloaded file's name
.then((fileName) => {
    return ftpClient.get(fileName)
})
.then((fileStream) => {            
    let chunks = [];

    return new Promise((resolve, reject) => {
        fileStream.on('data', (chunk) => {
            chunks.push(chunk);
        });
        fileStream.on('end', () => {
            resolve(Buffer.concat(chunks).toString('utf8'));
        });
    });
});

Это решение о том, как прочитать поток в переменную, которую я получил из ответов на на этот вопрос . Однако это не работает: data и end events просто никогда не излучаются.

Сравнивая мой код с в этом примере в документации библиотеки, единственное отличие состоит в том, что ReadableStream передается по каналу куда-то заранее.

Теперь, если я добавлю fileStream.pipe(...),

//...
.then((fileStream) => {

    fileStream.pipe(fs.createWriteStream('foo.txt'));
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    let chunks = [];

    return new Promise((resolve, reject) => {
//...

все отлично работает.

Итак, мой вопрос: какова цель добавления .pipe() и как он связан с data и end events?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...