回调来处理管道的完成

use*_*745 188 node.js

我使用以下node.js代码从一些URL下载文件并将其保存在磁盘中.我想知道何时下载文档.我还没有看到任何回调管道.或者,是否有任何'结束'事件可以在下载完成后捕获?

request(some_url_doc).pipe(fs.createWriteStream('xyz.doc'));
Run Code Online (Sandbox Code Playgroud)

Pic*_*els 292

流是EventEmitters,所以你可以听某些事件.如你所说,有一个finish请求事件(以前end).

 var stream = request(...).pipe(...);
 stream.on('finish', function () { ... });
Run Code Online (Sandbox Code Playgroud)

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

  • `var r = request(...).on("end",function(){/*CALLBACK*/}).pipe(...);` (12认同)
  • 'end'事件仍然存在,并在可读流上使用.可写流使用'finish'.这是因为转换流是两者的混合,需要区分事件. (12认同)
  • 这个线程很好地总结了如何使用节点流. (11认同)
  • 'end'事件现在'完成'Pipe事件:http://nodejs.org/api/stream.html#stream_event_finish (9认同)
  • 对我来说,事件'close',而不是'end'工作`r.on('close'),function(){...})` (6认同)
  • @Pickels这个答案看起来很酷,但是有一个问题:“ var stream”是源流还是dest流,是您从中请求或通过管道输入的? (2认同)

sma*_*wjw 39

基于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(){ ... });
Run Code Online (Sandbox Code Playgroud)


ruX*_*ruX 8

用于通过http(s)将文件管理内容传输到文件系统的代码片段.正如@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);
});
Run Code Online (Sandbox Code Playgroud)


Abu*_*mon 5

在这种情况下,我发现了一个有点不同的解决方案。想法值得分享。

大多数示例都是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 );
Run Code Online (Sandbox Code Playgroud)