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

相关推荐
hweiyu007 分钟前
Node.js 简介(附电子学习资料)
node.js
brzhang9 分钟前
我们复盘了100个失败的AI Agent项目,总结出这3个“必踩的坑”
前端·后端·架构
盛夏绽放9 分钟前
Node.js 项目启动命令大全 (形象版)
node.js·有问必答
郝同学的测开笔记31 分钟前
云原生探索系列(十九):Go 语言 context.Context
后端·云原生·go
小小琪_Bmob后端云1 小时前
引流之评论区截流实验
前端·后端·产品
考虑考虑1 小时前
JDK9中的takeWhile
java·后端·java ee
掘金一周1 小时前
数据脱敏的这6种方案,真香!| 掘金一周 5.29
前端·人工智能·后端
无名的人20251 小时前
Trae:重新定义效率边界 - 一款让工作流「自动进化」的智能工作台
后端
努力学习的明1 小时前
MQ解决高并发下订单问题,实现流量削峰
开发语言·后端·并发·mq
天天摸鱼的java工程师1 小时前
前端难还是后端难?作为八年后端开发,我想说点实话
前端·后端·程序员