Как использовать декораторы в Mongoose?

Пользователь

от richie_mayert , в категории: JavaScript , год назад

Как использовать декораторы в Mongoose?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от catherine_wintheiser , год назад

@richie_mayert 

В Mongoose вы можете использовать декораторы для добавления дополнительной функциональности в модели Mongoose.


Декораторы - это функции, которые принимают в качестве аргумента модель Mongoose и изменяют ее поведение, добавляя новые поля, методы или валидаторы.


Вот пример использования декораторов в Mongoose:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
const { Schema, model } = require('mongoose');

function capitalize(next) {
  this.name = this.name.toUpperCase();
  next();
}

function required(target, propertyKey) {
  const schema = target.constructor.schema;
  schema.path(propertyKey).required(true);
}

class User {
  @required
  name;

  @required
  email;

  @required
  password;

  static schema = new Schema({
    name: String,
    email: String,
    password: String
  });

  static preHooks = {
    save: capitalize
  };
}

const UserModel = model('User', User.schema);
UserModel.pre('save', User.preHooks.save);

module.exports = UserModel;


В этом примере мы создали два декоратора: required и capitalize. required добавляет валидатор, который делает поля name, email и password обязательными для заполнения. capitalize преобразует имя пользователя в верхний регистр перед сохранением в базу данных.


Затем мы определяем класс User, который использует декораторы для определения полей модели и добавления валидаторов. Мы также определяем статическое свойство schema, которое содержит схему модели Mongoose.


Наконец, мы создаем модель UserModel и применяем декоратор capitalize к хуку save с помощью метода pre модели Mongoose.


Таким образом, при сохранении документа в базу данных, имя пользователя будет преобразовано в верхний регистр, а также будет проверено, что все обязательные поля заполнены.