Mongoose ODM, измените переменные перед сохранением

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

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

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

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

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

С уважением


person dev.pus    schedule 04.07.2012    source источник
comment
Я думал, что документация на mongoosejs.com довольно ясна в этой области. Что вы пробовали, что не работает?   -  person JohnnyHK    schedule 04.07.2012
comment
сектор проверки ясен, но не как подготовить объект перед некоторым сохранением. Я думаю, что Schema.pre('save', callback); это может быть функция, но полный пример отсутствует, и я не знаю, как получить доступ к атрибутам объекта в предварительной функции   -  person dev.pus    schedule 04.07.2012
comment
Вы получаете доступ к атрибутам документа через this в своей промежуточной функции.   -  person JohnnyHK    schedule 04.07.2012
comment
Не могли бы вы скопировать это в ответ, чтобы я мог отметить ответ на вопрос :)   -  person dev.pus    schedule 04.07.2012


Ответы (3)


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

person JohnnyHK    schedule 04.07.2012

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

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

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

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

person bento    schedule 05.07.2012
comment
Стоит отметить, что это единственный вариант, если передаваемое значение отличается от типа, определенного в схеме для указанного свойства. напр. У вас есть свойство amount типа number, но значение, которое вы передаете для обработки, имеет тип string. - person Don; 23.05.2017

person    schedule
comment
можно отметить, что pre для «сохранения» не срабатывает при обновлении. вместо этого используйте «обновление» - person sasha; 12.10.2016
comment
@саша, можешь объяснить, что ты имеешь в виду? - person Dipanshu Mahla; 14.04.2021
comment
@DipanshuMahla Это было немного, и в настоящее время я не слишком углубляюсь в мангуст, но я имел в виду, вероятно, что функция schema.pre('save') не срабатывает (или не выполняется), когда данные получают обновлено. Он может срабатывать только при вставке новых данных. Поэтому, если вы хотите, чтобы обновления покрывались через schema.pre(), вы должны использовать «обновление» - person sasha; 05.05.2021