节点代理和异步数据库调用

时间:2011-12-30 01:35:46

标签: javascript node.js

我正在尝试使用node-proxy来自动神奇地读/写数据库,我无法找到解决方案。 这是代码:

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'方法返回node-proxy。 我正在寻找任何解决方案,我可以根据数据库结果返回代理数据。

由于

1 个答案:

答案 0 :(得分:1)

首先,由于最后的process.exit(0)行,此示例中没有任何内容可行。程序将在异步函数完成之前终止。

其次,您无法从异步函数的结果中返回值。这是一个基本概念。我不熟悉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;
});
...