我对我的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()
但我收到“标题已发送”错误。
在处理数据和文件下载完成之前,如何防止超时?
提前致谢
答案 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规范的最新修订版本
,但在大多数浏览器中对我来说效果很好。如果您对客户端也有一定的控制权,那么可以找到一种更好,更可靠的解决方案。