27

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

但令人惊讶的是,我的“结束”事件从未被触发。当我检查http://nodejs.org/api/stream.html#stream_event_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 事件?

4

2 回答 2

84

2013 年 10 月 30 日更新

当底层资源完成写入时,可读 Steam会发出close事件。

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

fs但是,如果您想捕捉完成将数据写入磁盘的时刻,则需要Writeable Streamfinish事件

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

request(options1).pipe(w);

w.on('finish', function(){
  console.log('file downloaded to ', '/tmp/imageresize/'+x);
});
于 2012-10-31T11:51:17.850 回答
3

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

  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. 我还提到了这些链接 - 他们可能会帮助某人。在 NodeJS 中使用 PDFMake 下载 PDF 失败这给了我发布的线索。

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

  3. leonid -beschastny也说得对,比赛条件不会发生 - 我通过交换位置来测试我的代码pdfStream.pipe(writerStream);

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

希望它可以帮助更多的人。

于 2021-06-07T13:09:56.203 回答