Expressjs rest api 如何处理链接功能

Expressjs rest api how to deal with chaining functionality

我正在使用 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}]
});

如您所见,朋友数组只是一个 ObjectId 数组。这些 ObjectIds 引用数据库中的特定用户。如果我想检索用户的朋友数组,我现在必须查找发出请求的用户,然后找到与朋友数组中具有相同 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 来 returns 您将收集朋友数据的承诺?

如果能得到所有帮助,我将不胜感激!

提前致谢。

Mongoose 有一个名为 population 的功能,可以在这些情况下提供帮助。基本上,Mongoose 将执行从数据库加载 friends 文档所需的额外 query/queries:

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