В данной статье пойдет речь о реализации паттерна Repository во взаимодействии с Mongoose ODM для использования в Node.js проектах.
Средства ODM Mongoose — предоставляют очень удобую обертку реализации запросов к MongoDB посредством схожего с LINQ стиля. Ниже представлена реализация репозитория на примере модуля UserRepo для модели User.
К примеру в реализации модели доступа к данным, можно вызвать метод IsExistsLogin репозитория таким вот образом:
Данная базовая реализация репозитория, в дальнейшем может быть дополнена различными методами для удовлетворения потребностей конкретного клиента.
Средства ODM Mongoose — предоставляют очень удобую обертку реализации запросов к MongoDB посредством схожего с LINQ стиля. Ниже представлена реализация репозитория на примере модуля UserRepo для модели User.
Описание реализации
- При создании экземпляра UserRepo, в конструктор, в качестве зависимости, передается объект mongoose, который был проинициализирован ранее
- Далее при помощи mongoose.model('User'); производится получение объекта мэппинга модели на базу и сохранение в свойстве под названием UserModel. Данное свойство используется в ряде методов, для получения доступа к функциям модели, которые позволят сформировать объект Query для дальнейшего использования. Среди данных методов в реализации, можно выделить Select и SelectOne. При вызове данных методов, клиент получает объект типа Query и что примечательно, в этот момент запроса к БД не производится. Этот факт позволяет сформировать запрос порционно и выполнить его в нужный момент времени.
- В методе IsExistsLogin можно увидеть наглядное применение вызова метода SelectOne() и последующее формирование и выполнение запроса.
Пример базовой реализации
- function UserRepo(mongoose){
- var that = this;
- that.UserModel = mongoose.model('User');
- that.IsExistsLogin = function(login, cb){
- that.SelectOne().where('login', login).run(function(err, user){
- cb(err, user);
- });
- };
- that.Save = function(user, cb){
- user.save(function(err){
- cb(err);
- });
- };
- that.Delete = function(user, cb){
- user.remove(function (err){
- cb(err);
- });
- };
- that.Select = function(){
- return that.UserModel.find({});
- };
- that.SelectOne = function(){
- return that.UserModel.findOne({});
- };
- }
- exports.UserRepo = UserRepo;
К примеру в реализации модели доступа к данным, можно вызвать метод IsExistsLogin репозитория таким вот образом:
- userRepo.IsExistsLogin(reqBody.userName, function(err, user){
- if(user){
- user.email = reqBody.userMail;
- user.password = reqBody.userPasswd;
- }
- next(err, user);
- });
Заключение
Данная базовая реализация репозитория, в дальнейшем может быть дополнена различными методами для удовлетворения потребностей конкретного клиента.