事件堆栈为空时关闭连接

时间:2015-03-30 00:54:09

标签: node.js mongodb

我对节点有点新意,到目前为止我很喜欢它,但也许我在需要扳手的时候遇到了一个锤子的情况。

我在文本文件中收集了大量数据,我需要将这些文件加载​​到数据库中 - 在普通的命令式语言中非常简单。我想为此编写惯用节点,因此宁愿使用异步fs调用(fs.readdirfs.readFile而不是fs.readdirSyncfs.readFileSync)。但是,我怎么知道所有这些操作何时完成,那么(并且只有那时)关闭数据库连接是否安全?

简而言之(伪代码):

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  fs.readDir(path, function(err, files) {
    for file in files {
      if (interesting(file)) {
        fs.readFile(file, function(err, data) {
          doc = turnDataIntoDocument(data);
          db.collection('foo').insert(doc);
        });
      }
    }
  });

  // This is the part that won't work right:
  db.close()
});

显然,db.close()可能在任何时候发生,可能在处理所有文件之前,或者通常在目录完全读取之前发生。

我知道有用于处理控制流程的库,但我觉得我应该理解如何在更基础的层面上做到这一点,而不是依赖于库来实现这么简单的事情 - 不要关闭连接直到我完成了它。

1 个答案:

答案 0 :(得分:0)

在这种情况下,一个简单的计数器应该起作用:

function doInserts(cb) {
  MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    fs.readDir(path, function(err, files) {
      var count = files.length;
      if (count === 0) {
        db.close();
        return cb();
      }
      for (var i = 0; i < files.length; ++i) {
        var file = files[i];
        if (interesting(file)) {
          fs.readFile(file, function(err, data) {
            doc = turnDataIntoDocument(data);
            db.collection('foo').insert(doc);
            if (--count === 0) {
              db.close();
              cb();
            }
          });
        } else if (--count === 0) {
          db.close();
          cb();
        }
      }
    });
  });
}