我正在使用promise-ftp
Node.js库从FTP服务器下载文件。函数ftpClient.get(...)
返回一个ReadableStream的Promise,应该使用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'));
});
});
});
这是关于如何将流读入我从this question的答案派生的变量中的解决方案。但是,它不起作用:data
和end events
永远不会发出。
将我的代码与库文档中的this example进行比较,唯一的区别是ReadableStream 已预先管道。
现在,如果我添加fileStream.pipe(...)
,
//...
.then((fileStream) => {
fileStream.pipe(fs.createWriteStream('foo.txt'));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
let chunks = [];
return new Promise((resolve, reject) => {
//...
一切正常。
所以我的问题是:添加.pipe()
的目的是什么?它如何与data
和end events
连接?