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

相关推荐
若水不如远方7 小时前
分布式一致性(三):共识的黎明——Quorum 机制与 Basic Paxos
分布式·后端·算法
三千星7 小时前
从Java到AI:我的转型之路 Ⅱ —— 手撸一个DeepSeek工具库
后端
beata7 小时前
Java基础-9:深入 Java 虚拟机(JVM):从底层源码到核心原理的全面解析
java·后端
SimonKing8 小时前
分享一款可以管理本地端口的IDEA插件:Port Manager
java·后端·程序员
一心赚狗粮的宇叔8 小时前
03.Node.js依赖包补充说明及React&Node.Js项目
前端·react.js·node.js
jbtianci8 小时前
Spring Boot管理用户数据
java·spring boot·后端
那我掉的头发算什么8 小时前
【Mybatis】Mybatis-plus使用介绍
服务器·数据库·后端·spring·mybatis
会算数的⑨9 小时前
Kafka知识点问题驱动式的回顾与复习——(一)
分布式·后端·中间件·kafka
Hx_Ma169 小时前
SSM搭建(三)Spring整合SpringMVC框架
java·后端·spring