Node.js nodeJS防止res.download超时
我有一个对我的nodeJS服务器的POST调用,该服务器在mongo数据库上搜索一些数据,并返回一个包含请求数据的CSV文件。问题是数据搜索和处理超过了2分钟nodeJS默认超时 在不同的场景中,y使用: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
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规范的最新修订遗漏
但它在大多数浏览器中都很适合我。如果您对客户机也有一定的控制权,那么就可以找到更好、更可靠的解决方案