2015-06-04 2 views
0

Я создаю успокоительный API, используя экспресс, мангуст и монгодб. Он работает отлично, но у меня есть вопрос о том, как обращаться с запросами, которые содержат больше функциональных возможностей, чем просто найти, удалить или обновить в базе данных. Моя модель пользователя выглядит следующим образом:Expressjs rest api, как бороться с функциональностью цепочки

var UserSchema = new Schema({ 
    emailaddress: {type: String, unique: true}, 
    firstname: String, 
    lastname: String, 
    password: String, 
    friends: [{type: Schema.Types.ObjectId, unique: true}] 
}); 

Как вы можете видеть, массив друзей представляет собой массив объектов ObjectIds. Эти ObjectIds относятся к конкретным пользователям в базе данных. Если я хочу получить массив друзей пользователя, теперь я должен искать пользователя, который делает запрос, а затем найти всех пользователей, имеющих тот же идентификатор, что и в массиве друзей.

Теперь это выглядит следующим образом:

methods.get_friends = function(req, res) { 
    //find user. 
    User.findOne({_id: req.params.id}, function(err, user, next) { 

    if(err) next(err); 
    if(user) { 
     console.log(user); 

     //find friends 
     User.find({_id: {$in: user.friends}}, {password: 0}).exec(function (err, 
     friends, next) { 
     if(err) next(err); 
     if(friends) { 

      res.send(friends); 
     }; 
     }); 
    } 

Будет ли возможно отделить поиск пользователя в определенном способе и цепочки методов? Я видел что-то о цепочке связующего ПО, то есть app.get('/friends', getUser, getFriend), но это означает, что мне нужно изменить объект req в моем методе промежуточного программного обеспечения (getUser), а затем передать его? Как бы вы решили эту проблему? Возможно, вы измените модель мангуста и сохраните все данные друзей (это значит, что это может устареть) или вы создадите метод getUser, который вернет обещание, по которому вы будете собирать данные друга?

Буду благодарен за всю помощь, которую я могу получить!

Заранее спасибо.

+2

Я бы, вероятно, использовал способность Mongoose [population] (http://mongoosejs.com/docs/populate.html), которая уже довольно похожа на вашу текущую схему. Средство промежуточного уровня (по крайней мере, так, как вы описываете) представляет собой конструкцию Express, которая не имеет непосредственного смысла применять поверх Mongoose IMO. – robertklep

+0

Спасибо, Роберт, я использовал способность заполнить. Не могли бы вы создать ответ с информацией о своем комментарии, тогда я могу принять его как правильный ответ. – Bram

ответ

0

У Mongoose есть функция под названием population, которая существует, чтобы помочь в таких ситуациях. В основном, Mongoose будет выполнять дополнительный запрос/запросы, которые необходимы для загрузки friends документов из базы данных:

User.findOne({_id: req.params.id}) 
    .populate('friends') 
    .exec(function(err, user) { 
     ... 
    }); 

Это загрузит любые связанные с друзьями в user.friends (как массив).

Если вы хотите добавить дополнительные ограничения (в вашем примере, password : 0), вы можете сделать это:

User.findOne({_id: req.params.id}) 
    .populate({ 
     path : 'friends' 
     match : { password : 0 }, 
    }) 
    .exec(function(err, user) { 
     ... 
    }); 

Смотрите также this documentation.

+0

почти точно, что я сделал для решения этой проблемы. Спасибо! – Bram

Смежные вопросы