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

相关推荐
q***96581 小时前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
凌波粒2 小时前
Springboot基础教程(3)--自动装配原理/静态资源处理/欢迎页
java·spring boot·后端
凌波粒2 小时前
SpringBoot基础教程(2)--yaml/配置文件注入/数据校验/多环境配置
java·spring boot·后端·spring
S***26752 小时前
Spring Boot环境配置
java·spring boot·后端
6***83052 小时前
什么是Spring Boot 应用开发?
java·spring boot·后端
n***78682 小时前
SpringBoot详解
java·spring boot·后端
星释2 小时前
Rust 练习册 96:Rectangles与几何计算
开发语言·后端·rust
切糕师学AI2 小时前
Spring 是什么?
java·后端·spring
老神在在0012 小时前
Mybatis01
后端·学习·spring·java-ee·mybatis
c***72742 小时前
SpringBoot + vue 管理系统
vue.js·spring boot·后端