2012-08-16 39 views
0

從貓鼬填充對象,而數據庫的一部分,你通常在Javascript中創建一個新的對象是這樣的:在Node.js的

function object() { 
    this.attribOne: 42, 
    this.attribTwo: 'fourtytwo', 

    [and so on creating more attribs and functions.] 
}; 

一旦做到這一點,你像這樣創建的對象的新「實例」

var myObject = new object; 

而myObject將具有正確的屬性和功能。

如果我需要使用Mongoose(異步)從MongoDB加載屬性值,有沒有辦法做到這一點?

與此相似?

function object() { 
    /* list of attributes */ 
    this.attribOne: null, 
    this.attribTwo: null, 

    function init(){ 
     // mongoose db call 
     // set attributes based on the values from db 
    } 
}; 

我看着init函數,但似乎他們沒有做我所需要的。 (或我只是沒有得到它)​​

我認爲這很簡單,我忽略了明顯的,所以請指向正確的方向。非常感謝!

+0

我不知道我理解的問題。您從MongoDB查詢中獲得的文檔已經是JavaScript對象。 – JohnnyHK 2012-08-16 15:18:04

+0

是的,這是真的,但我想填充一個對象,其中有沒有存儲在數據庫中的其他屬性和功能。例如:this.attribPlus = this.attribOne + this.attribTwo;或使用功能類似...我希望這是有道理的。 :) – 2012-08-16 15:22:28

回答

1

我不知道MongoDB的,但你可以很容易地做你想做的通過傳遞你從服務器返回到構造數據庫對象:

你也可以傳遞對象,像這樣:

var myObject = new object(MongoDBObj); 

然後在你的目標代碼,你可以做這樣的事情:

function object(data) { 

this.myProp1 = data.Prop1;//from db obj 
this.myProp2 = data.Prop2;//from db obj 

this.myProp3 = getProp3Calculation(); //from global calculation 

[more functions and props for the object] 

} 

編輯:我的第一個評論

你也可以做到這一點(簡單的例子);

function object() { 

this.myProp1 = null; 
this.myProp2 = null; 

this.myProp3 = getProp3Calculation(); //from global calculation 

this.init = function([params]){ 
    var that = this;  


    var data = loadData(params); 

    //if asynchronous the following code will go into your loadCompletedHandler 
    //but be sure to reference "that" instead of "this" as "this" will have changed 
    that.myProp1 = data.Prop1; 
    that.myProp2 = data.Prop2; 

}; 

[more functions and props for the object] 

} 

更新3 - 下面的討論顯示結果:

function object() { 

this.myProp1 = null; 
this.myProp2 = null; 

this.myProp3 = getProp3Calculation(); //from global calculation 

this.init = function([params], callback){ 
    var that = this;  



    var model = [Mongoose Schema]; 
    model.findOne({name: value}, function (error, document) { 
     if (!error && document){ 

      //if asynchronous the following code will go into your loadCompletedHandler 
      //but be sure to reference "that" instead of "this" as "this" will have changed 
      that.myProp1 = document.Prop1; 
      that.myProp2 = document.Prop2; 

      callback(document, 'Success'); 


     } 
     else{ 
      callback(null, 'Error retrieving document from DB'); 
    } 
    }); 



}; 

[more functions and props for the object] 

} 
+0

感謝您的回覆。我知道這個選項,但這意味着,我有一個數據庫調用「我的對象之外」。我希望將DB調用保存在對象中,最好是創建新對象時執行的函數。 例如:var myObject = new Object()。init([parameters]); 其中init()函數執行數據庫調用並填充屬性。 – 2012-08-16 15:41:09

+0

同樣的想法。不要在創建時傳遞選項,只需激發對象的方法並從您從數據庫中獲取的值中加載對象屬性。您可以使用「this」.property從函數引用對象的屬性。我將在上面更新我的答案 – muck41 2012-08-16 15:45:54

+0

請在此處查看代碼:http://pastebin.com/JjtJxrQG (回調不需要像那樣傳入。) 我可以訪問並設置裏面的「that」的值數據庫調用? – 2012-08-16 15:59:17