“真实世界”全栈开发-3.11-关注功能

2018-02-12  本文已影响16人  桥头堡2015

这一讲我们来实现用户之间的关注功能。

修改用户模型

关注功能引入了新的信息,所以我们需要修改用户模型:添加一个数组,记录该用户关注的其他用户的ID。

打开models/User.js,添加一行代码:

const User = new mongoose.Schema({
  // ...
  // +++
  following: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
  // +++
  salt: String
}, {timestamps: true});

接下来,新建添加关注者的方法。如同添加点赞过的博文一样,需要查重。

UserSchema.methods.follow = function (id) {
  if (this.following.indexOf(id) === -1) {
    this.following.push(id);
  }

  return this.save();
};

对应的,取消关注用户的方法如下:

UserSchema.methods.unfollow = function (id) {
  this.following.remove(id);
  return this.save();
};

我们还需要判定是否关注某个用户的方法:

UserSchema.methods.isFollowing = function(id){
  return this.following.some(function(followId){
    return followId.toString() === id.toString();
  });
};

最后,我们用上面刚刚定义的这个方法,在返回的公共信息里面加上关注与否的数据(之前定死为false):

UserSchema.methods.toProfileJSONFor = function (user) {
  return {
    username: this.username,
    bio: this.bio,
    image: this.image || 'https://static.productionready.io/images/smiley-cyrus.jpg',
    // ***
    following: user ? user.isFollowing(this._id) : false
    // ***
  };
};

模型所需的改动就是这些。下面我们来实现对该功能对应的端点。

实现API端点

关注、去掉关注,不用说,需要两个端点。

关注用户

其端点为POST /api/profiles/:username/follow,需要身份验证,返回被关注者的公共信息JSON对象。

routes/api/profiles.js加入如下代码:

router.post('/:username/follow', auth.required, loadCurrentUser, (req, res, next) => {
  const followeeId = res.locals.profile._id;
  return res.locals.user.follow(followeeId)
    .then(() => res.json({profile: res.locals.profile.toProfileJSONFor(res.locals.user)}))
    .catch(next);
});

取消关注

端点为DELETE /api/profiles/:username/follow, 需要身份验证,同样返回被取消关注者的公共信息JSON对象。

继续往routes/api/profiles.js加入如下代码:

router.delete('/:username/follow', auth.required, loadCurrentUser, (req, res, next) => {
  const followeeId = res.locals.profile._id;
  return res.locals.user.unfollow(followeeId)
    .then(() => res.json({profile: res.locals.profile.toProfileJSONFor(res.locals.user)}))
    .catch(next);
});

到此我们就实现了关注、取消关注用户的功能。

上一篇下一篇

猜你喜欢

热点阅读