Expressjs休息api如何处理链接功能

时间:2015-06-04 10:17:08

标签: node.js express mongoose router

我正在使用express,mongoose和mongodb构建一个restful API。它工作得很好,但我有一个问题,关于如何处理包含更多功能的请求,而不仅仅是在数据库中查找,删除或更新。我的用户模型如下所示:

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

正如您所看到的,friends数组只是一个ObjectIds数组。这些ObjectId引用数据库中的特定用户。如果我想要检索用户朋友的数组,我现在必须查找发出请求的用户,然后找到与friends数组中具有相同ID的所有用户。

现在看起来像这样:

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),但这是否意味着我必须在我的中间件(getUser)方法中更改req对象然后将其传递给它?你会如何解决这个问题?您是否可以更改mongoose模型并保存所有朋友数据(意味着它可能会过时)或者您是否会创建一个方法getUser来返回您将收集朋友数据的承诺?

我将非常感谢能得到的所有帮助!

提前谢谢。

1 个答案:

答案 0 :(得分: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