节点js url被多次请求

时间:2015-02-02 07:40:13

标签: node.js

我是Node js的新手。我正在尝试使用节点js将大型CSV文件导入到mongoDB中。我的方法名称是' saveCSVintoDB '。我在这个方法中使用csvtojson转换器来解析文件。由于该文件有超过100万条记录,转换器大约需要2分钟来解析整个文件。同时,我的节点js方法' saveCSVintoDB '正在被再次请求并且解析重新开始。我不希望这发生。我不会用较小的文件来解决这个问题,因为它们的解析速度要快得多,下一个请求也会从那里接管。

问题仅在解析发生时等待约2分钟。我不明白这种行为。我坚持了很久。有些人可以解释一下并提出一些可能的选择吗?

谢谢, 纳雷什

1 个答案:

答案 0 :(得分:0)

您可以尝试添加时间戳来检查第二次请求的时间:

 console.log("got request @" + new  Date());

由于处理需要时间,因此请求将超时,因此会触发另一个请求。您需要增加超时间隔。

在香草JS中:

var server = http.createServer(function (req, res) { ... });
server.timeout = 120000;

如果您使用的是Express,则可以使用Connect Middleware for Timeout支持:

var timeout = express.timeout // express v3 and below
var timeout = require('connect-timeout'); //express v4

app.use(timeout(120000));

修改:处理多个请求问题:

SO上的大部分答案暗示第二个请求是针对favicon的。但是我在我的本地机器上检查过,在大约2分钟的间隔之后发出的第二个请求不是这种情况,打印req.url指向同一页面/saveCollection

我可以建议在本地机器上运行的黑客攻击:

  • 根据要求发送标题:res.writeHead(200, { 'Content-Type': 'application/json' });。这将花费我们2分钟的时间。
  • 现在设置一个间隔,该间隔将每隔2分钟继续为浏览器提供虚拟数据。
  • 计算完成后删除间隔,发送实际结果并关闭响应。

以下是一个例子:

    router.post('/saveCollection', function(req, res,next) { 
      console.log("col name:"+req.param("collName"));   
      var fileStream=fs.createReadStream(req.files.myFile.path); 
      var csvConverter=new Converter({constructResult:false});
      csvConverter.on("end_parsed",function() { 
        console.log('file completely parsed:'); 
        clearInterval(si);
        res.write(", 'success':true}");
        res.end();
      });

      i = 0;
      var si = setInterval(function() {
        i++;
        res.write(",'dummy" + i + "' : 'piece'");
      }, 1000 * 60); //this should be kept a little less than two minutes

      console.log('before parsing'); 
      res.writeHead(200, { 'Content-Type': 'application/json' });
      res.write("{'dummy':'piece'");
      fileStream.pipe(csvConverter);    
    }); 

我无法想到这样做的其他方法。即使您忽略第二个请求,第一个请求仍然会过期,浏览器可能会显示错误。

还有另一项工作,一开始计算并在计算开始后立即发送响应,然后使用套接字检查状态。