2014-02-17 6 views
10

Во время работы с Node.js, Mongoose и MongoDB, я обнаружил, что мои мошенники и сеттеры схемы Mongoose не срабатывают при выполнении запроса findOne.Почему мои мошенники и установщики схемы Mongoose 3.8.7 игнорируются?

Я нашел старую нить, которая говорит о наличии проблемы с геттерами и сеттерами в версии 2.x, но в ней говорится, что с тех пор она была решена, и я использую самую последнюю версию Mongoose (3.8.7).

Вот часть моей схемы

function testGetter(value) { 
     return value + " test"; 
} 

/** 
* Schema 
*/ 

var schema = new Schema({ 
     username: { type: String, required: true, unique: true, get: testGetter } 
}); 

// I have also tried this. 

schema.path('username').get(function (value, schemaType) { 
     return value + " test"; 
}); 

Вот как я выполнить запрос

Model 
.findOne(conditions, fields, options) 
.populate(population) 
.exec(function (error, doc) { 
     callback(doc, error); 
}); 

Он реагирует со значением имени пользователя, который испытывает недостаток в "тест" пост-FIX. Я здесь что-то не так? Любая помощь будет принята с благодарностью!

Дополнительная информация

Это является результатом находка одного:

{ 
    "username": "Radius" 
} 

Это значение schema.paths.username.getters после применения одного через один из двух способов, описанных выше:

[ [Function: testGetter] ] 

ответ

29

У меня была такая же проблема с геттерами, которые не изменяли возвращенные документы при запросе с помощью Mongoose. Чтобы это применимо к каждому запросу, вы можете сделать это:

// Enable Mongoose getter functions 
schema.set('toObject', { getters: true }); 
schema.set('toJSON', { getters: true }); 
+0

Это сработало для меня. Благодаря! Однако, можете ли вы объяснить, почему мы должны упомянуть выше для геттеров?Кажется, что сеттеры работают, не позволяя функциям сеттера Mongoose. – Albin

2

Попробуйте

schema.virtual('password').get(function() { 
    return this.username; 
}); 

как функция вашего геттера, this - это ваш экземпляр объекта, а параметр value здесь не имеет большого значения.

Если вы пишете функцию сеттера, вам нужно будет написать this.username = value.

+0

Основная проблема заключается в том, что геттер, который у меня есть, полностью игнорируется. Дело не в том, что возвращаемое значение заканчивается пустым. Я попытался применить ваши предложения к моему коду, но геттер остается неиспользованным. Спасибо за ваш ответ, хотя! Я добавлю некоторые разъяснения к моему первоначальному вопросу. –

+0

О, также вы можете попробовать использовать «виртуальный» вместо пути. – Tuxkowo

+0

Я попытался использовать виртуальную, чтобы перезаписать путь имени пользователя 'schema.virtual ('username'). Get (function() {...});' и даже попытался создать отдельный виртуальный 'schema.virtual ('test ') 'с" test "в качестве возвращаемого значения, чтобы увидеть, работают ли виртуальные машины для меня, но безрезультатно. –

5

Предполагаете ли вы, что виртуальные машины не работают, потому что они не отображаются в вашем файле console.log? Если это так, то по дизайну. Виртуальные файлы являются внешними по отношению к вашему фактическому документу, поэтому не печатайте с помощью console.log по умолчанию. Чтобы получить их для отображения, прочитайте эти документы: http://mongoosejs.com/docs/api.html#document_Document-toObject

+1

Я не смотрел записи в консоли, но я просто отправил документ обратно в ответ. После прочтения фрагмента документации, которую вы мне дали, я изменил 'doc' на' doc.toObject ({getters: true, seters: true, virtuals: true}) ', и теперь он работает. Большое спасибо! –

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