nodeJS 防止 res.download 超时

Alb*_*ats 5 timeout response download node.js express

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

在不同的场景中 y 使用:

res.writeHeader(200,'application/json');            
res.write('starting fetch .... ');
Run Code Online (Sandbox Code Playgroud)

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

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

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

res.writeHeader(200,'application/json');            
res.write('starting fetch .... ');
res.download()
Run Code Online (Sandbox Code Playgroud)

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

关于如何防止数据处理和文件下载完成之前超时的想法吗?

提前致谢

kha*_*han 1

首先,有一些小事情,我认为应该是res.writeHead()而不是res.writeHeader()。其次,一旦您发送了标头,您就无法再次发送它们。您收到错误是因为res.download()使用res.sendFile()它重新发送标头。您不能使用res.download()or res.sendFile()or 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);

});
Run Code Online (Sandbox Code Playgroud)

这对我来说效果很好。res.writeProcessing() 发送102状态代码。建议持续时间超过 20 秒的请求,但这篇博客文章说

102 已省略 HTTP 规范的最新修订

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