Pull to refresh

Паттерн Repository в связке с Mongoose ODM

Reading time 3 min
Views 4.9K
В данной статье пойдет речь о реализации паттерна Repository во взаимодействии с Mongoose ODM для использования в Node.js проектах.
Средства ODM Mongoose — предоставляют очень удобую обертку реализации запросов к MongoDB посредством схожего с LINQ стиля. Ниже представлена реализация репозитория на примере модуля UserRepo для модели User.


Описание реализации


  • При создании экземпляра UserRepo, в конструктор, в качестве зависимости, передается объект mongoose, который был проинициализирован ранее
  • Далее при помощи mongoose.model('User'); производится получение объекта мэппинга модели на базу и сохранение в свойстве под названием UserModel. Данное свойство используется в ряде методов, для получения доступа к функциям модели, которые позволят сформировать объект Query для дальнейшего использования. Среди данных методов в реализации, можно выделить Select и SelectOne. При вызове данных методов, клиент получает объект типа Query и что примечательно, в этот момент запроса к БД не производится. Этот факт позволяет сформировать запрос порционно и выполнить его в нужный момент времени.
  • В методе IsExistsLogin можно увидеть наглядное применение вызова метода SelectOne() и последующее формирование и выполнение запроса.


Пример базовой реализации


  1. function UserRepo(mongoose){    
  2.     var that = this;
  3.     that.UserModel = mongoose.model('User');
  4.  
  5.     that.IsExistsLogin = function(login, cb){
  6.         that.SelectOne().where('login', login).run(function(err, user){            
  7.             cb(err, user);
  8.         });
  9.     };
  10.  
  11.     that.Save = function(user, cb){        
  12.         user.save(function(err){
  13.            cb(err);
  14.         });
  15.     };
  16.  
  17.     that.Delete = function(user, cb){
  18.         user.remove(function (err){
  19.             cb(err);
  20.         });
  21.     };
  22.  
  23.     that.Select = function(){
  24.         return that.UserModel.find({});
  25.     };
  26.  
  27.     that.SelectOne = function(){
  28.         return that.UserModel.findOne({});
  29.     };
  30. }
  31.  
  32.  
  33. exports.UserRepo = UserRepo;


К примеру в реализации модели доступа к данным, можно вызвать метод IsExistsLogin репозитория таким вот образом:

  1. userRepo.IsExistsLogin(reqBody.userName, function(err, user){
  2.         if(user){
  3.            user.email = reqBody.userMail;
  4.            user.password = reqBody.userPasswd;
  5.         }
  6.         next(err, user);
  7. });


Заключение

Данная базовая реализация репозитория, в дальнейшем может быть дополнена различными методами для удовлетворения потребностей конкретного клиента.
Tags:
Hubs:
+1
Comments 1
Comments Comments 1

Articles