2013-03-15 2 views
5

У меня есть простой JS класс:Проблемы хранения функции JS в Монго DB с Node.js

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

Я затем хранить его в MongoDB используя драйвер по умолчанию Node.js:

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-функции, так и свойства as-is. Если это не так, можете ли вы порекомендовать, как я могу обойти это?

Спасибо!

+0

Ваш пример работает для меня через оболочку монго. Нет ошибок, которые так всегда и sayHello() вызывается правильно тоже. – zeusdeux

+0

@zeusdeux вопрос о двух процессах: mongodb и отдельном процессе сервера приложений node.js. Оболочка mongo - это утилита разработки. Этот вопрос касается создания приложения в node.js. –

+0

@peter да, я получил это немного. Методы объектов сериализуются до хранения в любом случае, поэтому, по всей вероятности, результат не должен отличаться независимо от того, где он выполняется, будь то клиент-монго или приложение-узел. Я попробую это из приложения сегодня, чтобы быть уверенным. – zeusdeux

ответ

9

Mongo не может хранить функции (код), только данные. Возьмите необработанные данные, которые вы вернетесь, и передайте их функции-конструктора, или рассмотрите ODM, как mongoose.

Существует очень специфический и ограниченный набор условий, в которых вы можете отправить код функции mongo в строковой форме и оценить его на сервере. Они задокументированы в the MongoDB manual. Тем не менее, цель этого кода, работающего внутри mongo, заключается в поддержке сложных операций с данными, а не моделировании логики приложения, о чем спрашивает этот вопрос. Логика приложения содержится в вашем файле node.js .js. Данные поступают в базу данных.

+3

MongoDB на самом деле МОЖЕТ хранить код. – zeusdeux

+0

http://dirolf.com/2010/04/05/stored-javascript-in-mongodb-and-pymongo.html – Joe

+1

Согласен с изменением. Разделите логику приложения и данные, над которыми он работает. Отправьте данные в mongodb и логику приложения в модули вашего приложения. – zeusdeux

Смежные вопросы