页面加载后,Express.js加载文件

时间:2014-08-05 05:48:47

标签: javascript node.js express

我正在开发一个读取和写入文件的Web应用程序。这是在我的index.js路由文件中。当我加载结果页面时,它表示它无法加载coverage文件。我知道这是因为它在请求页面加载之前还没有写完。我的问题是如何在加载完成后加载文件并更新页面?

router.get('/results?', function(req, res) {
  var id = req.query.id;
  var sequence = fs.readFileSync(temppath + id + ".sequence");
  var refseq = fs.readFileSync(temppath + id + ".refseq");
  var coverage = fs.readFileSync(temppath + id + ".coverage.txt");
  res.render('results', { title: 'Results', sequence: sequence, refseq:refseq, coverage: coverage});
});

router.post('/calculate-coverage', function(req, res) {
  var id = crypto.randomBytes(20).toString('hex');  
  var sequence = req.body.sequence;
  var sequence = ">" + temppath + id + "\n" + sequence.replace(/ /g,'');
  var refseq = req.body.refseq;
  var refseq = ">" + temppath + id + "\n" + refseq.replace(/ /g,'');
  //display progress here
  //write to files
  var sequenceFile = temppath + id + ".sequence";
  var refseqFile = temppath + id + ".refseq";
  fs.writeFileSync(sequenceFile, sequence);
  fs.writeFileSync(refseqFile, refseq);
  //bamtools coverage script
  var cmd = 'bash ./scripts/coverage.sh ' + sequenceFile + " " + refseqFile + " " + temppath + id;
  console.log(cmd);
    exec(cmd, function(error, stdout, stderr) {
        console.log('stdout: ' + stdout);
        console.log('stderr: ' + stderr);
        if (error !== null) {
            console.log('exec error: ' + error);
        }
    });

  res.location("results?id="+id);
  res.redirect("results?id="+id);

});

1 个答案:

答案 0 :(得分:1)

永远不要使用这样的同步功能。因为如果您有100个并发请求,并且其中一个请求使用了同步功能,则其他99个客户端将等待此功能结束。而是使用异步类似物:

fs.readFile(temppath + id + ".sequence", "utf8", function(err, sequence) {
  fs.readFile(temppath + id + ".refseq", "utf8", function(err, refseq) {
    fs.readFile(temppath + id + ".coverage.txt", "utf8", function(err, coverage) {
      res.render('results', { title: 'Results', sequence: sequence, refseq:refseq, coverage: coverage});
    });
  });
});