【问题标题】:nodeJS prevent timeout on res.downloadnodeJS防止res.download超时
【发布时间】:2016-05-19 08:25:33
【问题描述】:

我有一个对我的 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()

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

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

提前致谢

【问题讨论】:

    标签: node.js express download timeout response


    【解决方案1】:

    首先是一些小事,我认为应该是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 规范的最新修订版中

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

    【讨论】:

      猜你喜欢
      • 2011-01-04
      • 2022-01-19
      • 2019-07-25
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      相关资源
      最近更新 更多