createReadStream().pipe()回调

Alb*_*elB 15 javascript node.js

提前抱歉,我在这里有关于createReadStream()的几个问题.

基本上我正在做的是动态构建一个文件,并在完成后使用fs将其传输给用户.我正在使用.pipe()来确保我正确地进行节流(如果缓冲区已满,请停止读取,如果不是则再次启动,等等.)这是我到目前为止的代码示例.

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')
})
Run Code Online (Sandbox Code Playgroud)

我已经阅读了另一个StackOverflow问题(抱歉,丢失了它),如果你使用常规的res.send()和res.end(),那么.pipe()效果很好,因为它调用.send和.end并添加限制.

这对大多数情况都适用,除了我想要在流完成后删除文件而不使用.pipe()意味着我将不得不自己处理限制以获得回调.

所以我猜我要创建自己的假"res"对象,它有一个.send()和.end()方法,它可以执行res通常所做的事情,但是在.end()上我会添加其他代码来清理生成的文件.我的问题基本上是如何解决这个问题?

非常感谢帮助,谢谢!

log*_*yth 28

关于下载的第一部分可以通过NodeJS Server的下载文件来回答.

至于在文件全部发送后删除文件,只需添加自己的事件处理程序,一旦发送完所有内容就删除文件.

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');
});
Run Code Online (Sandbox Code Playgroud)

error处理器是不是100%必要的,但这时如果有一个错误,而你正在尝试发送它不会删除该文件.