与node.js中的fs.createWriteStream关联的事件

时间:2012-10-31 10:53:35

标签: node.js stream

写入流时达到EOF时会触发什么事件? 我的代码如下。它是http://docs.nodejitsu.com/articles/advanced/streams/how-to-use-fs-create-write-stream

但令人惊讶的是,我的'结束'事件从未被解雇过。当我检查http://nodejs.org/api/stream.html#stream_event_end时,我发现可写流在'end'上没有任何事件


var x = a1.jpg;
var options1 = {'url': url_of_an_image, 'encoding': null};
var r = request(options1).pipe(fs.createWriteStream('/tmp/imageresize/'+x));

r.on('end', function(){
    console.log('file downloaded to ', '/tmp/imageresize/'+x);
}

如何捕获EOF事件?

2 个答案:

答案 0 :(得分:62)

2013年10月30日更新

可读的Steams emit close event when the underlying resource done writing

r.on('close', function(){
  console.log('request finished downloading file');
});

但是如果你想抓住fs完成向光盘写入数据的那一刻,你需要Writeable Stream finish event

var w = fs.createWriteStream('/tmp/imageresize/'+x);

request(options1).pipe(w);

w.on('finish', function(){
  console.log('file downloaded to ', '/tmp/imageresize/'+x);
});

答案 1 :(得分:1)

这真的很旧,但这仍然为我节省了很多时间。

  1. 来自 leonid-beschastny 的解决方案是正确的。但是,在进行调用的完整顺序中存在非常细微的差异。解决方案都来自专家,像我这样的新手迷路了 - 由于简单的差异,例如 - 如何创建流或描述中遗漏了对象。

  2. 此外,这是许多其他场景的通用解决方案。当您通过管道传输到 writableStream 时 - 并且到包含此操作的异步函数时 - 返回。流式传输未完成 - 因此可能通过管道传输到的图像/文档/pdf 尚未创建。它将大小为 0 KB。

  3. 通过简单的步骤在此处分享。

    a. createPdfKitDocument with your definition as required.
    
    b. Create the writeStream the way you want as per your design.
    
    c. Pipe your prepared document to this stream.
    
    d. Add this finish event to your writeStream.
    
    e. Most important - without this it doesn't work.
    

这里

var pdfStream = printer.createPdfKitDocument(docDefinition); //a
let writerStream = fs.createWriteStream(fullfileName); //b
pdfStream.pipe(writerStream); //c
writerStream.on('finish', function () {
    //This could be your callback function.
    callback());
}) //d
pdfStream.end(); //e
  1. 我还提到了这些链接 - 它们可能对某人有所帮助 一种。 PDF download fails using PDFMake in NodeJS 这给了我发帖的线索。

  2. 主要问题是 - createWriteStream 未完成 [由于任何原因] - 到包含它的异步函数时 - 返回。

  3. 还有 leonid-beschastny 说不会发生竞争条件是正确的 - 我通过交换 pdfStream.pipe(writerStream); 的位置来测试我的代码

writerStream.on('finish', function () {
    //This could be your callback function.
    callback());
})

希望它能帮助更多人。