实现视频的喜欢和不喜欢功能:Node.js与Mongoose的实践指南

实现视频的喜欢和不喜欢功能:Node.js与Mongoose的实践指南

在视频分享或社交媒体平台中,"喜欢"和"不喜欢"的功能是用户互动的重要组成部分。本篇博客将详细介绍如何在使用Node.js和Mongoose的环境中实现这一功能。我们将通过创建模型、路由和控制器来逐步搭建这一功能。

1. 路由的设置

首先,我们需要为"喜欢"和"不喜欢"功能设置路由。这些路由将处理对特定视频的喜欢或不喜欢的请求:

js 复制代码
// router/video.js
router
  .get('/like/:videoId', verifyToken(), videoController.likeVideo)
  .get('/dislike/:videoId', verifyToken(), videoController.disLikeVideo);

这里使用了verifyToken()中间件来确保只有认证过的用户可以进行操作。

2. 数据模型的创建

我们需要一个模型来存储用户对视频的喜欢或不喜欢的状态。我们创建了videoLikeModel

js 复制代码
// model/videoLikeModel.js
const mongoose = require('mongoose');
const baseModel = require('./baseModel');

const videoLikeSchema = new mongoose.Schema({
  user: {
    type: mongoose.ObjectId,
    required: true,
    ref: "User"
  },
  video: {
    type: mongoose.ObjectId,
    required: true,
    ref: "Video"
  },
  like: {
    type: Number,
    enum: [1, -1], // 1 表示喜欢, -1 表示不喜欢
    required: true
  },
  ...baseModel
});

module.exports = videoLikeSchema;

此模型关联了用户和视频,并记录了用户是喜欢还是不喜欢该视频。

3. 更新视频模型

为了跟踪每个视频的喜欢和不喜欢的总数,我们需要在视频模型中添加这些属性:

js 复制代码
// model/videoModel.js
const videoSchema = new mongoose.Schema({
  likeCount: {
    type: Number,
    default: 0
  },
  dislikeCount: {
    type: Number,
    default: 0
  }
});

4. 控制器逻辑

在控制器中,我们将处理喜欢和不喜欢的逻辑。这包括检查用户当前的喜欢状态,并据此更新状态和计数:

js 复制代码
jsCopy code
// videoController.js
exports.likeVideo = async (req, res) => {
  const videoId = req.params.videoId;
  const userId = req.user.userinfo._id;
  const video = await Video.findById(videoId);
  if (!video) {
    return res.status(404).json({ err: "视频不存在" });
  }
  let doc = await VideoLike.findOne({ user: userId, video: videoId });

  if (doc && doc.like === 1) {
    await doc.deleteOne();
    video.likeCount--;
  } else if (doc && doc.like === -1) {
    doc.like = 1;
    await doc.save();
    video.likeCount++;
    video.dislikeCount--;
  } else {
    await new VideoLike({ user: userId, video: videoId, like: 1 }).save();
    video.likeCount++;
  }

  await video.save();
  res.status(200).json({
    ...video.toJSON(),
    isLike: doc ? doc.like === 1 : true
  });
};

相似的逻辑适用于disLikeVideo函数。

5. 测试和验证

最后,我们需要确保这些API在实际应用中表现正常。这涉及到API的测试和直接数据库验证,以确保数据的正确性。

  • postman接口测试
  • 查看数据库中数据变化

通过实现这些功能,我们不仅增强了用户的互动体验,也为平台带来了更多关于用户偏好的数据,这有助于推荐系统等更高级的功能。这种实现方式展示了Node.js和Mongoose在构建现代Web应用中的灵活性和强大功能。

相关推荐
H5css�海秀7 小时前
今天是自学大模型的第一天(sanjose)
后端·python·node.js·php
SuniaWang7 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
韩立学长7 小时前
Springboot校园跑腿业务系统0b7amk02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
sheji34167 小时前
【开题答辩全过程】以 基于springboot的扶贫系统为例,包含答辩的问题和答案
java·spring boot·后端
代码栈上的思考8 小时前
消息队列:内存与磁盘数据中心设计与实现
后端·spring
程序员小假9 小时前
我们来说一下 b+ 树与 b 树的区别
java·后端
Meepo_haha9 小时前
Spring Boot 条件注解:@ConditionalOnProperty 完全解析
java·spring boot·后端
sheji34169 小时前
【开题答辩全过程】以 基于springboot的房屋租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
Victor35610 小时前
MongoDB(57)如何优化MongoDB的查询性能?
后端
Victor35610 小时前
MongoDB(58)如何使用索引优化查询?
后端