Javascript createReadStream().pipe()回调

Javascript createReadStream().pipe()回调,javascript,node.js,Javascript,Node.js,很抱歉,这里有几个关于createReadStream()的问题 基本上,我正在做的是动态构建一个文件,并在完成后使用fs将其流式传输给用户。我使用.pipe()来确保节流正确(如果缓冲区已满,则停止读取,如果缓冲区未满,则重新开始读取,等等)。这是我迄今为止的代码示例 http.createServer(function(req, res) { var stream = fs.createReadStream('<filepath>/example.pdf', {bufferS

很抱歉,这里有几个关于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')
})
http.createServer(函数(req,res){
var stream=fs.createReadStream('/example.pdf',{bufferSize:64*1024})
流管(res);
}).监听(3002,函数(){
console.log('服务器在端口3002上侦听')
})
我在另一个StackOverflow问题(抱歉,丢失了它)中读到,如果使用常规的res.send()和res.end(),则.pipe()工作得很好,因为它调用.send和.end并添加了节流

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

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


非常感谢您的帮助,谢谢

关于下载的第一部分可以通过以下方式回答

至于在文件全部发送后删除文件,您只需添加自己的事件处理程序即可在文件全部发送后删除文件

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');
});
var stream=fs.createReadStream('/example.pdf',{bufferSize:64*1024})
流管(res);
var有错误=false;
stream.on('error',函数(err){
had_error=true;
});
stream.on('close',function(){
如果(!had_error)fs.unlink('/example.pdf');
});

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

该文件的可能副本确实回答了我的文件下载问题,谢谢!我将更新该问题以仅反映.pipe()问题。啊,太棒了!我不知道在管道流时可以添加事件。我假设每个事件只能有一个事件处理程序,它将被pipe()调用使用。谢谢