nodeJS防止res.download超时

时间:2016-05-19 08:25:34

标签: node.js express download timeout response

我对我的nodeJS服务器进行了POST调用,该服务器在mongo数据库中搜索一些数据并返回包含所请求数据的CSV文件。问题是数据搜索和处理超过2分钟nodeJS默认超时。

在使用的不同场景中:

res.writeHeader(200,'application/json');            
res.write('starting fetch .... ');

通过不时发送一些res.write('');来保持请求并防止客户端超时。

现在我使用res.download()下载生成的csv文件,因此不仅仅是发送JSON作为响应。

试图像这样使用这个解决方案:

res.writeHeader(200,'application/json');            
res.write('starting fetch .... ');
res.download()

但我收到“标题已发送”错误。

在处理数据和文件下载完成之前,如何防止超时?

提前致谢

1 个答案:

答案 0 :(得分:0)

首先有一些小事情,我认为应该是res.writeHead()而不是res.writeHeader()。其次,一旦发送了标头,就无法再次发送它们。您收到错误消息是因为res.download()使用res.sendFile()会重新发送标头。您不能使用res.download()res.sendFile()res.send(),因为这三种方法都隐式设置了标头并作为响应的一部分进行发送。您需要结合使用res.writeHead()res.write()res.end()。我只是GET,所以我可以从浏览器中对其进行测试,显然可以使用post。

router.get('/test', function (req,res,next) {
 res.writeHead(200, {'Content-Type': 'application/json',
         'Content-Disposition': 'attachment',
         'filename':'package.json'
 });

 fs.readFile("package.json",function (err,data) {
     if (err) {
         throw err;
     }else{
         setTimeout(function () {
             res.write(data);
             res.end()
         },200000);

     }


 });

 function keepBusy(){
     if(!res.finished){
         res.writeProcessing();
         setTimeout(keepBusy,1000)
     }

 }

 setTimeout(keepBusy,1000);

});

这对我来说很好。 res.writeProcessing()发送 102 状态代码。建议持续时间超过20秒的请求,但this博客帖子指出

  

102遗漏了HTTP规范的最新修订版本

,但在大多数浏览器中对我来说效果很好。如果您对客户端也有一定的控制权,那么可以找到一种更好,更可靠的解决方案。

相关问题