Структура модели базы данных

Система изначально имеет определенную структуру базы данных. Эта структура может быть получена из sql - базы данных с помощью процедуры синхронизации данных, или просто использоваться текущая из git.

Файл со структурой базы данных хранится в modules/models/serverconfig.js

Любой модуль может расширить любую модель дополнительными полями. Все изменения в базе данных, которые делает модуль находятся в его папке в файле db.js

Рассмотрим расширение модели пользователя в модуле login:

var  crypto   = require('crypto');

module.exports = {
    models:{
        user:{
            UserPhoto  : {type : String  , default : null, extended:true, ignoresave:true, template:"form_image"},
            MailCode   : {type : String, default : '', trim : true, select:false},
            MobilePhone: {type : String, default : '', trim : true, mask:"+7 (999) 999-9999"},
            PassHash   : {select:false},
            PassSalt   : {select:false}
        }
    },
    schema: {
        user: function(schema){
            schema.path('LoginUser').set(function(val){  return (val+'').toLowerCase().trim(); });
            schema.path('Mail').set(function(val){ return (val+'').toLowerCase().trim(); });
            schema.statics.SearchableFields = function(){
                return ["NameUser","CodeUser","LoginUser","JobTitle","Phone","Mail","Comment","CodeObj"];
            }

            schema.virtual('password')
            .set(function(password) {
                if (password) {
                    this._plainPassword = password;
                    this.PassSalt = Math.random() + '';
                    this.PassHash = this.encryptPassword(password);
                    this.DoResetPass = false;
                    }
                })
            .get(function() { return this._plainPassword; });
            schema.method({
                encryptPassword : function(password) {
                  return crypto.createHmac('sha512', this.PassSalt).update(password).digest('hex'); 
                },
                checkPassword : function(password) {
                  if ((this.PassHash)&&(password))
                          return this.encryptPassword(password+'') === this.PassHash;
                  else return false;
                }
            });
            return schema; 
        }
    }
}

В данном примере модель расширяется 2 полями: UserPhoto и MailCode. Остальным полям просто добавляются расширенные свойства. Например для поля MobilePhone указывается маска редактирования, а для полей с паролем и солью указывается, что эти поля по умолчанию запрашивать из базу ненужно.

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

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

В дальнейшем в коде присвоение пароля будет выглядеть как:

Хотя на самом деле пароль в базе данных присутствовать не будет, вместо поля password сохранятся PassHash и PassSalt

При работе с моделями можно указывать любой тип данных поддерживаемый MongoDb и надстройкой над ней Mongoose

На стороне клиента вся информация о структуре моделей тоже присутствует

Вы можете создать любую модель с помощью вызова функции MModels.Create. В качестве аргументов передаются 2 параметра: название модели и объект со значением полей. Недостающие поля будут инициализированы значениями по умолчанию.

Пример создания и работы с моделью (код выполнен в консоли разработчика):

Last updated

Was this helpful?