在Node.js中创build同步MongoDB查询的正确方法是什么?

我正在使用MongoDB的Node.JS驱动程序,我想执行一个同步查询,就像这样:

function getAThing() { var db = new mongo.Db("mydatabase", server, {}); db.open(function(err, db) { db.authenticate("myuser", "mypassword", function(err, success) { if (success) { db.collection("Things", function(err, collection) { collection.findOne({ name : "bob"}, function(err, thing) { return thing; }); }); } }); }); } 

问题是,db.open是一个asynchronous调用(它不会阻塞),所以getAThing返回“未定义”,我希望它返回查询的结果。 我敢肯定,我可以采取某种阻断机制,但是我想知道正确的做法。

没有办法让这个同步W / O某种可怕的黑客。 正确的方法是让getAThing接受一个callback函数作为参数,然后一旦可用就调用该函数。

 function getAThing(callback) { var db = new mongo.Db("mydatabase", server, {}); db.open(function(err, db) { db.authenticate("myuser", "mypassword", function(err, success) { if (success) { db.collection("Things", function(err, collection) { collection.findOne({ name : "bob"}, function(err, thing) { db.close(); callback(err, thing); }); }); } }); }); } 

现在可以使用Mongo Sync ,这是在Node.js中创build同步MongoDB查询的正确方法。

我正在使用这个相同的。 你可以像下面这样写同步方法:

 var Server = require("mongo-sync").Server; var server = new Server('127.0.0.1'); var result = server.db("testdb").getCollection("testCollection").find().toArray(); console.log(result); 

注意:它依赖于节点光纤,并在Windows 8上有一些问题。

快乐编码:)

虽然它不是严格同步的,但我反复采用并发现非常有用的模式是在asynchronous函数上使用co和promisify yield。 对于mongo,你可以重写上面的内容:

 var query = co( function* () { var db = new mongo.Db("mydatabase", server, {}); db = promisify.object( db ); db = yield db.open(); yield db.authenticate("myuser", "mypassword"); var collection = yield db.collection("Things"); return yield collection.findOne( { name : "bob"} ); }); query.then( result => { } ).catch( err => { } ); 

意即:

  1. 您可以使用任何asynchronous库编写“同步”代码
  2. 错误是从callback中抛出的,这意味着你不需要成功检查
  3. 您可以将结果作为承诺传递给其他任何代码