看看:
var Client = require('ftp');
var fs = require('fs');
var c = new Client();
c.on('ready', function() {
c.get('foo.txt', function(err, stream) {
if (err) throw err;
stream.once('close', function() { c.end(); });
stream.pipe(fs.createWriteStream('foo.local-copy.txt'));
});
});
// connect to localhost:21 as anonymous
c.connect();
这段代码来自 https://www.npmjs.org/package/ftp。基本上,它打开一个读取流并将其通过管道传输到写入流中。最后,它会关闭来自源的连接。
管道方法是否在管道流(源)关闭后关闭目标流?我在 API 文档中找不到它。
我做了一些测试,从女巫那里我可以得出结论,但它确实如此,但我不确定。
当源发出end
事件时,目标流将关闭。这记录在 Stream.pipe 中:
默认情况下,当源流在目标上调用 end() 发出 end,以便目标不再可写。
这允许调用以下形式的:
var http = require('http'),
fs = require('fs');
http.createServer(function (req, res) {
fs.createReadStream('path/to/file').pipe(res);
}).listen(3000);
如果未在 response
对象上调用 end
,则请求将超时。
这将使请求超时:
fs.createReadStream('path/to/file').pipe(res, {end: false});