如何在Node.js应用中实现用户频道的订阅与取消订阅功能

如何在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

该模型包括两个主要字段:userchannel,分别代表订阅者和被订阅的频道。

更新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应用中实现了一个基本的用户订阅与取消订阅功能。希望这篇博客能帮助您在构建社交互动特性时有所启发。

相关推荐
2401_8574396911 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66612 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
阿华的代码王国33 分钟前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话
德育处主任Pro1 小时前
『Django』APIView基于类的用法
后端·python·django
Missmiaomiao2 小时前
npm install慢
前端·npm·node.js
哎呦没3 小时前
SpringBoot框架下的资产管理自动化
java·spring boot·后端
2401_857600953 小时前
SpringBoot框架的企业资产管理自动化
spring boot·后端·自动化
NiNg_1_2347 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
Chrikk9 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*9 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go