2012-07-04 2 views
10

Я хочу, чтобы создать слой модели с Mongoose для моих пользовательских документов, который делает:Mongoose ODM, изменять переменные перед сохранением

  1. проверки (уникальный, длина)
  2. canonicalisation (имя пользователя и адрес электронной почты преобразуются в в нижнем регистре, чтобы проверить уникальность)
  3. поколение соли
  4. пароль хеширования
  5. (регистрация)

Все эти действия необходимо выполнить перед тем, как продолжить работу с db. К счастью, mongoose поддерживает проверку, плагины и промежуточное программное обеспечение.

Плохо то, что я не могу найти хороший материал по этому вопросу. Официальные документы на mongoosejs.com слишком короткие ...

Есть ли у кого-нибудь пример о предварительных действиях с Mongoose (или полный плагин, который делает все, если он существует)?

С уважением

+0

Я думал, что документация по mongoosejs.com было довольно ясно в этой области. Что вы пробовали, что не работает? – JohnnyHK

+0

сектор проверки является ясным, но не как подготовить объект до некоторого сохранения. Я думаю, что Schema.pre («save», callback); функция может быть, но полный пример отсутствует и я не знаю, как получить доступ к атрибутам объекта в предварительной функции. –

+0

Вы получаете доступ к атрибутам документа через 'this' в своей функции промежуточного программного обеспечения. – JohnnyHK

ответ

24

В вашей Schema.pre('save', callback) функции this является документом, сохраняются, и изменения, внесенные в нее перед вызовом next() изменить сохраненные данные.

14

Другой вариант - использовать Getters. Вот пример с веб-сайта:

function toLower (v) { 
    return v.toLowerCase(); 
} 

var UserSchema = new Schema({ 
    email: { type: String, set: toLower } 
}); 

http://mongoosejs.com/docs/getters-setters.html

+0

Стоит отметить, что это единственный вариант, если значение, которое вы передаете, не совпадает с типом, определенным в схеме для указанного свойства , E. g. У вас есть свойство 'amount', которое имеет тип' number', но значение, которое вы передаете для обработки, является 'string'. – Don

8
var db = require('mongoose'); 
var schema = new db.Schema({ 
    foo:  { type: String } 
}); 

schema.pre('save', function(next) { 
    this.foo = 'bar'; 

    next(); 
}); 

db.model('Thing', schema); 
+0

можно отметить, что pre для 'save' не запускается при обновлении. вместо этого используйте 'update' – sasha

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