2011-12-30 21 views
1

我想用戶節點代理自動神奇的讀/寫數據庫和我想不通的解決方案。 下面是代碼:節點代理和異步數據庫調用

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); 

通常我將是確定與回調,但我不能確定如何使關於「獲得」的方法節點代理回報的工作。 我正在尋找任何解決方案,我可以根據數據庫結果返回代理數據。

感謝

回答

1

首先,沒有任何事情在這個例子中工作,因爲在最後的process.exit(0)線。該程序將在異步函數完成之前終止。

其次,你不能從一個異步函數的結果返回一個值。這是一個基本概念。我對mongojs不熟悉,但也許下面的工作(我相信它會與貓鼬)。

... 
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; 
}); 
... 
+0

由於某些原因,我花了4個月的時間纔看到這個答案 - 我很感謝你看着這個 - 謝謝! – 2012-03-21 02:28:29