如何在Node.js应用中实现用户频道的订阅与取消订阅功能
在现代Web应用中,用户之间的互动很大程度上依赖于订阅机制。这篇博客将指导您如何在Node.js环境下,使用Mongoose和Express框架来实现一个用户频道的订阅与取消订阅功能。
设计数据库模型
首先,我们需要设计存储订阅信息的数据模型。我们创建一个名为subscribeModel.js
的文件,定义如下的模型结构:
js
const mongoose = require('mongoose')
const baseModel = require('./baseModel')
const subscribeSchema = new mongoose.Schema({
user: {
type: mongoose.ObjectId,
required: true,
ref: 'User'
},
channel: {
type: mongoose.ObjectId,
required: true,
ref: 'User'
},
...baseModel
})
module.exports = subscribeSchema
该模型包括两个主要字段:user
和channel
,分别代表订阅者和被订阅的频道。
更新User模型
我们还需要在userModel
文件中增加一个用于计数的字段,用于跟踪每个用户的订阅者数量:
js
subscribeCount: {
type: Number,
default: 0
},
编写控制器逻辑
控制器部分包括订阅和取消订阅的逻辑:
订阅功能
js
exports.subscribe = async (req, res) => {
const userId = req.user.userinfo._id
const channelId = req.params.userId
if (userId === channelId) {
return res.status(401).json({ err: '不能关注自己' })
}
const record = await Subscribe.findOne({
user: userId,
channel: channelId
})
if (!record) {
await new Subscribe({
user: userId,
channel: channelId
}).save()
const user = await User.findById(channelId)
user.subscribeCount++
await user.save()
res.status(200).json({ msg: "关注成功" })
} else {
res.status(401).json({ err: "已经订阅了此频道" })
}
}
取消订阅功能
js
exports.unsubscribe = async (req, res) => {
const userId = req.user.userinfo._id
const channelId = req.params.userId
if (userId === channelId) {
return res.status(401).json({ err: '不能取消关注自己' })
}
const record = await Subscribe.findOne({
user: userId,
channel: channelId
})
if (record) {
await record.remove()
const user = await User.findById(channelId)
user.subscribeCount--
await user.save()
res.status(200).json(user)
} else {
res.status(401).json({ err: "没有订阅了此频道" })
}
}
设置路由
在router/user.js
中设置相应的路由以处理HTTP请求:
js
router.get('/subscribe/:userId', verifyToken(), userController.subscribe)
router.get('/unSubscribe/:userId', verifyToken(), userController.unSubscribe)
通过这些步骤,我们成功地在一个Node.js应用中实现了一个基本的用户订阅与取消订阅功能。希望这篇博客能帮助您在构建社交互动特性时有所启发。