Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js nodeJS防止res.download超时_Node.js_Express_Download_Timeout_Response - Fatal编程技术网

Node.js nodeJS防止res.download超时

Node.js nodeJS防止res.download超时,node.js,express,download,timeout,response,Node.js,Express,Download,Timeout,Response,我有一个对我的nodeJS服务器的POST调用,该服务器在mongo数据库上搜索一些数据,并返回一个包含请求数据的CSV文件。问题是数据搜索和处理超过了2分钟nodeJS默认超时 在不同的场景中,y使用: res.writeHeader(200,'application/json'); res.write('starting fetch .... '); 通过发送一些res.write(“”),使请求保持活动状态并防止客户端超时不时 现在,我使用res.download

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

在不同的场景中,y使用:

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()
但是我得到了“headers ready sent”错误

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


首先,我想应该是
res.writeHead()
而不是
res.writeHeader()
。第二,一旦你发送了标题,你就不能再发送了。出现错误是因为
res.download()
使用
res.sendFile()
重新发送标题。您不能使用
res.download()
res.sendFile()
res.send()
,因为这三种方法都会隐式设置头并将其作为响应的一部分发送。您需要结合使用
res.writeHead()
res.write()
res.end()
。我只是得到,所以我可以测试它从浏览器,你可以使用后明显

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秒的请求,建议使用此选项,但博客帖子中指出

102已被HTTP规范的最新修订遗漏

但它在大多数浏览器中都很适合我。如果您对客户机也有一定的控制权,那么就可以找到更好、更可靠的解决方案