如果流没有事先通过管道传递,则不会发出ReadableStream的“数据”事件

时间:2019-05-13 14:19:15

标签: node.js promise ftp stream

我正在使用promise-ftp Node.js库从FTP服务器下载文件。函数ftpClient.get(...)返回一个ReadableStream的Promise,应该使用dataend 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'));
        });
    });
});

这是关于如何将流读入我从this question的答案派生的变量中的解决方案。但是,它不起作用:dataend events永远不会发出。

将我的代码与库文档中的this example进行比较,唯一的区别是ReadableStream 已预先管道

现在,如果我添加fileStream.pipe(...)

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

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

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

一切正常。

所以我的问题是:添加.pipe()的目的是什么?它如何与dataend events连接?

0 个答案:

没有答案