2013-03-15 35 views
5

我有一個簡單的JS類:問題存儲JS功能蒙戈DB與Node.js的

var User = function(id){ 
    this._id = id; 
    this.sayHello = function(){ 
     return "hello"; 
    } 
} 

然後我去使用默認的驅動程序的Node.js,將其存儲在MongoDB中:

users.insert(new User(1)); 

最後,我檢索用戶,並嘗試執行函數:

users.findOne({_id:1}, function(err, item) { 
    console.log("Say hello: " + item.sayHello()); 
}); 

我收到以下錯誤,這實在是令人困惑:

throw err; 
     ^
TypeError: Object #<Object> has no method 'sayHello' 

我完全失去了這一個。我的理解是,MongoDB存儲JS功能和屬性。如果情況並非如此,你能推薦我如何解決這個問題嗎?

謝謝!

+0

你的例子通過mongo shell爲我工作。沒有錯誤,所以永遠sayHello()也被正確調用。 – zeusdeux 2013-03-15 11:22:17

+0

@zeusdeux的問題是關於2個進程:mongodb和一個單獨的node.js應用服務器進程。 mongo shell是一個開發工具。這個問題是關於在node.js中構建一個應用程序的。 – 2013-03-15 15:27:46

+0

@peter是的,我得到了那一點。在存儲之前,對象方法是序列化的,所以很可能結果不會有差別,而不管它從何處執行,無論它是mongo客戶端還是節點應用程序。 今天我將嘗試從應用程序內部進行確認。 – zeusdeux 2013-03-16 15:18:22

回答

9

Mongo不能存儲函數(代碼),只能存儲數據。把你得到的原始數據傳遞給構造函數,或者考慮像貓鼬這樣的ODM。

有一組非常具體和有限的條件,您可以發送mongo函數代碼以字符串形式並在服務器上進行評估。這些記錄在the MongoDB manual中。但是,運行在mongo內部的代碼的目的是支持複雜的數據查詢操作,而不是模擬應用程序邏輯,這就是這個問題的要求。應用程序邏輯位於您的node.js模塊.js文件中。數據進入數據庫。

+3

MongoDB實際上可以存儲代碼。 – zeusdeux 2013-03-15 11:19:14

+0

http://dirolf.com/2010/04/05/stored-javascript-in-mongodb-and-pymongo.html – Joe 2013-03-16 12:48:06

+1

我同意編輯。獨立的應用程序邏輯和它所處理的數據。將數據發送到應用程序中的模塊中的mongodb和應用程序邏輯。 – zeusdeux 2013-03-16 15:20:26