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)
但我收到“标头已发送”错误。
关于如何防止数据处理和文件下载完成之前超时的想法吗?
提前致谢
首先,有一些小事情,我认为应该是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 规范的最新修订
但它在大多数浏览器中对我来说效果很好。如果您对客户端也有一定的控制权,那么可能会有更好、更可靠的解决方案。
| 归档时间: |
|
| 查看次数: |
2521 次 |
| 最近记录: |