“真实世界”全栈开发-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);
});
到此我们就实现了关注、取消关注用户的功能。