NodeJS竞争条件?

时间:2014-09-16 02:24:08

标签: node.js

我目前有一段代码可以将文件下载到本地文件系统中。这很简单:

var downloadFile = function(request, file_name, cb) {
  var final_path = file_name + '.pdf';
  var file = fs.createWriteStream(final_path);

  // Save temporary file to disk
  var save_file = request.pipe(file);

  save_file.on('finish', function () {
    cb('success', final_path);
  });
}

然而,有时,我会遇到一个错误(稍后在代码中),表明该文件尚未完全下载。当我自己手动打开文件时,它看起来很好。此外,当我们在网站上同时拥有相当多的用户时,错误似乎更频繁地发生。

所有这些都清楚地向我暗示了可能的竞争条件,但我不确定这可能发生在何处或如何发生。我对节点的理解是它是单线程的非阻塞I / O,这表明任何可能的罪魁祸首都在I / O部分:createWriteStream和后续管道(可能是'finish'回调处理程序)。也许他们被某种方式覆盖或被称为无序。但是怎么样?完成处理程序看起来像标准的承诺/回调。任何见解都将非常感谢!

-Edward

1 个答案:

答案 0 :(得分:-1)

试试这个:

var downloadFile = function(request, file_name, cb) {
  var final_path = file_name + '.pdf';
  var file = fs.createWriteStream(final_path);

  // Save temporary file to disk
  request.pipe(file);

  request.on('end', function () {
    cb('success', final_path);
  });
}
相关问题