在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 => { } );
意即:
- 您可以使用任何asynchronous库编写“同步”代码
- 错误是从callback中抛出的,这意味着你不需要成功检查
- 您可以将结果作为承诺传递给其他任何代码