首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >createReadStream().pipe()回调

createReadStream().pipe()回调
EN

Stack Overflow用户
提问于 2013-02-20 00:12:58
回答 1查看 41K关注 0票数 17

很抱歉,在这里我有几个关于createReadStream()的问题。

基本上,我正在做的是动态构建一个文件,并在完成后使用fs将其流式传输给用户。我使用.pipe()来确保我的节流是正确的(如果缓冲区已满,则停止读取,如果缓冲区未满,则重新开始,依此类推)以下是我到目前为止拥有的代码示例。

代码语言:javascript
复制
http.createServer(function(req, res) {
  var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024})

  stream.pipe(res);

}).listen(3002, function() {
  console.log('Server listening on port 3002')
})

我在另一个StackOverflow问题中读到(对不起,忘了),如果您使用常规的res.send()和res.end(),那么.pipe()工作得很好,因为它调用.send和.end并增加了节流。

这在大多数情况下都很好用,除非我想在流完成后删除文件,并且不使用.pipe()意味着我必须自己处理节流,只为了得到一个回调。

所以我猜我会想要创建我自己的伪" res“对象,它有一个.send()和.end()方法,这个方法完成res通常做的事情,但是在.end()上,我会添加额外的代码来清理生成的文件。我的问题基本上是我该如何做到这一点?

如果能帮上忙,我们将不胜感激,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-20 02:45:57

关于下载的第一部分可以通过Download file from NodeJS Server来回答。

至于在发送完所有文件后删除文件,您只需添加自己的事件处理程序即可在所有内容发送完毕后删除该文件。

代码语言:javascript
复制
var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024})
stream.pipe(res);

var had_error = false;
stream.on('error', function(err){
  had_error = true;
});
stream.on('close', function(){
  if (!had_error) fs.unlink('<filepath>/example.pdf');
});

error处理程序并不是100%需要的,但是如果在尝试发送文件时出现错误,则不会删除该文件。

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14962085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档