Я использую библиотеку 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
?