208

我正在使用以下 node.js 代码从某个 url 下载文档并将其保存在磁盘中。我想知道何时下载文档。我没有看到任何带有管道的回调。或者,是否有任何可以在下载完成时捕获的“结束”事件?

request(some_url_doc).pipe(fs.createWriteStream('xyz.doc'));
4

5 回答 5

324

流是EventEmitters,因此您可以收听某些事件。正如您所说,有一个finish请求事件(以前end)。

 var stream = request(...).pipe(...);
 stream.on('finish', function () { ... });

有关哪些事件可用的更多信息,您可以查看流文档页面

于 2012-07-12T08:59:09.540 回答
44

基于 nodejs 文档http://nodejs.org/api/stream.html#stream_event_finish,它应该处理 writableStream 的finish事件。

var writable = getWriteable();
var readable = getReadable();
readable.pipe(writable);
writable.on('finish', function(){ ... });
于 2014-10-13T08:47:01.647 回答
9

用于通过 http(s) 将 Web 内容传输到文件系统的代码片段。正如@starbeamrainbowlabs 注意到事件finish确实有效

var tmpFile = "/tmp/somefilename.doc";

var ws = fs.createWriteStream(tmpFile);
ws.on('finish', function() {
  // pipe done here, do something with file
});

var client = url.slice(0, 5) === 'https' ? https : http;
client.get(url, function(response) {
  return response.pipe(ws);
});
于 2015-09-11T15:45:38.557 回答
4

关于这个上下文,我发现了我的问题的一个有点不同的解决方案。思想值得分享。

大多数示例都是readStreams从文件创建的。但在我的情况下readStream,必须从JSON来自消息池的字符串创建。

var jsonStream = through2.obj(function(chunk, encoding, callback) {
                    this.push(JSON.stringify(chunk, null, 4) + '\n');
                    callback();
                });
// message.value --> value/text to write in write.txt 
jsonStream.write(JSON.parse(message.value));
var writeStream = sftp.createWriteStream("/path/to/write/write.txt");

//"close" event didn't work for me!
writeStream.on( 'close', function () {
    console.log( "- done!" );
    sftp.end();
    }
);

//"finish" event didn't work for me either!
writeStream.on( 'close', function () {
    console.log( "- done!"
        sftp.end();
        }
);

// finally this worked for me!
jsonStream.on('data', function(data) {
    var toString = Object.prototype.toString.call(data);
    console.log('type of data:', toString);
    console.log( "- file transferred" );
});

jsonStream.pipe( writeStream );
于 2016-03-09T08:42:50.000 回答
4

这是一个处理请求中的错误并在文件写入后调用回调的解决方案:

request(opts)
    .on('error', function(err){ return callback(err)})
    .pipe(fs.createWriteStream(filename))
    .on('finish', function (err) {
        return callback(err);
    });
于 2018-01-18T21:41:15.393 回答