美文网首页
“真实世界”全栈开发-3.11-关注功能

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

作者: 桥头堡2015 | 来源:发表于2018-02-12 10:42 被阅读16次

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

    修改用户模型

    关注功能引入了新的信息,所以我们需要修改用户模型:添加一个数组,记录该用户关注的其他用户的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);
    });
    

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

    相关文章

      网友评论

          本文标题:“真实世界”全栈开发-3.11-关注功能

          本文链接:https://www.haomeiwen.com/subject/brjrtftx.html