节点代理和asynchronous数据库调用

我想用户节点代理自动神奇地读/写数据库,我无法find一个解决scheme。 这里是代码:

var Proxy = typeof Proxy !== "undefined" ? Proxy : require("node-proxy"); var db = require('mongojs').connect('testdb',['colldb']); function itemHandler(objid) { var objid=objid; return Proxy.create({ get: function(receiver, name) { var name = name; var hmmm; //Problem Area! db.colldb.findOne({"_id": db.ObjectId(objid)},function(err,doc){ hmmm = doc[name]; }); //Hmmm will obviously be undefined return hmmm; } , set: function(receiver, name, val) { // this can be async and I don't care :) } }); } var test = itemHandler('4efc0c698b7e904ee982547f'); console.log(test.test); process.exit(0); 

通常我会回电话确定,但我不确定如何使用get方法返回节点代理。 我正在寻找任何解决scheme,我可以返回基于数据库结果的代理数据。

谢谢

首先,由于最后的process.exit(0)行,这个例子中没有什么可行的。 程序将在asynchronous函数完成之前终止。

其次,你不能从一个asynchronous函数的结果中返回一个值。 这是一个基本的概念。 我不熟悉mongojs ,但也许下面的工作(我相信它会与mongoose)。

 ... return Proxy.create({ get: function(receiver) { return db.colldb.findOne({"_id": db.ObjectId(objid)}); }); ... 

那么最后一行会是这样的:

 itemHandler('4efc0c698b7e904ee982547f').exec(function (err, doc){ console.log(doc.test); }); 

或者,您可能会返回一个承诺/未来。 就像是:

 ... return Proxy.create({ get: function(receiver, name) { var name = name , promise = new Promise(); // You'll need a library for this, of course. db.colldb.findOne({"_id": db.ObjectId(objid)}, function (err, doc){ promise.complete(doc[name]); }); return promise; }); ...