mongodb 喜欢/不喜欢带有NodeJS的系统

uxhixvfz  于 2022-12-12  发布在  Go
关注(0)|答案(1)|浏览(147)

(请在下面的回答帖中找到我的解决方案)
我今天的问题是关于一个喜欢/不喜欢的简单系统,这个系统有nodeJ,数据在MongoDB上。

您的情况如何?

1.我已经得到了一个API后端的实现。前端已经完成了,不要再碰了。

  1. API的目的是让人们可以通过选择参数来发布辣酱。每个用户都必须登录才能执行任何操作!在这个开发阶段,任何页面上的刷新都会将用户直接返回到登录页面。
    1.我现在要完成的最后一项任务是为“喜欢/不喜欢”简单系统实现路由。此系统具有以下设置:
  • 如果用户点击“拇指向上”,则前端发送“1”数值(此后称为“LikeStatus”)
  • 如果用户单击“拇指向下”,前端将发送类似“-1”的状态
  • 如果用户取消点击他们的喜欢/不喜欢,则前端发送“0”LikeStatus
  • 当用户单击任一缩略图时,用户的ID将存储在对象模型中内置的两个数组之一中:usersLiked或usersDisliked,这取决于用户所做的选择。请注意,这两个数组都包含在“酱料”模型中,因此它们不会出现在用户模型中。
  • 在前端侧,当用户单击任何拇指时,另一个拇指变灰,防止用户单击它。用户必须取消单击他们的初始选择才能选择另一个。

您有什么问题?

我的问题是当用户从“1”或“-1”返回到“0(零)"时,我无法跟踪用户的取消点击。这是因为我不知道如何检查用户在返回到零之前的位置。对我来说,确保将他从正确的数组中删除并递减正确的计数器是很重要的,而不是两者兼而有之或错误的一个。
在尝试了我下面描述的方法后,我正在寻找一种方法来检查:

  • userId存储在哪个数组中(userLiked或userDisliked)

  • 用户的最后一个likeStatus是什么(1或-1)

到目前为止,您尝试了哪些方法?

我想使用if/else链来检查likeStatus,并搜索数组usersLiked和usersDisliked,以查看userId(这里称为'liker')是否在其中。如果它在usersLiked中,那么我可以递减喜欢计数器,如果id在userDisliked中,则相反。但这两个数组都被视为“undefined”,因此无法读取。

向我们展示您的代码

下面是我迄今为止构建的相似/不相似路由的完整代码:

exports.likeSauce = (req,res,next) =>{  
  const liker = req.body.userId;
  let likeStatus = req.body.like;
  let usersLiked = req.body.usersLiked;
  let usersDisliked = req.body.usersDisliked;
  if(likeStatus===1){
    sauce.updateOne({_id:req.params.id}, {$inc:{likes:+1},$push:{usersLiked:liker}})
      .then(()=>res.status(201).json({message:'you liked this sauce'}))
      .catch(error=>res.status(400).json({error}))
  } else if (likeStatus===-1) {
      sauce.updateOne({_id:req.params.id}, {$inc:{dislikes:+1},$pull:{usersLiked:liker},$push:{usersDisliked:liker}})
      .then(()=>res.status(201).json({message:'you disliked this sauce'}))
      .catch(error=>res.status(400).json({error}))
  } else if(likeStatus===0){
    if(usersLiked.includes(liker)){
      sauce.updateOne({_id: req.params.id}, { $inc: { likes: -1}, $pull: { usersLiked:liker}})
    } else if (usersDisliked.includes(liker)){
      sauce.updateOne({_id: req.params.id}, { $inc: { dislikes: -1}, $pull: { usersDisliked:liker}})
    }
  }
}

还有其他可能有用的信息吗?

下面是“酱料”模型,两个数组都在它的末尾:

const mongoose = require('mongoose');
const sauceSchema = mongoose.Schema({
  userId: {type:String},
  name: {type:String, required:true},
  manufacturer:{type:String, required:true},
  description:{type:String, required:true},
  mainPepper: {type:String, required:true},
  imageUrl:{type:String, required:true},
  heat: {type:Number, required:true},
  likes: {type:Number},
  dislikes : {type:Number},
  usersLiked : {type:["String <userId>"]},
  usersDisliked: {type:["String <userId>"]},
});

module.exports = mongoose.model('sauce', sauceSchema);

这个问题与this one类似,但那里提供的解决方案对我没有太大帮助(顺便说一句,情况也一样)
你在这里,我感谢你阅读我的长帖子,并为任何帮助,你可能能够提供。

fv2wmkja

fv2wmkja1#

我终于解决了我自己的问题,并想与大家分享。这不是一个非常优雅也不是完美的动态解决方案,但至少它帮助我解决了我的问题。理想情况下,我希望通过应用usersLiked和usersDisliked数组动态地增加喜欢和不喜欢计数器。length,但如果有人有想法,欢迎。废话少说,下面是代码:

exports.likeSauce = (req,res,next)=>{  
  const liker = req.body.userId;
  let likeStatus = req.body.like;
  sauce.findOne({_id:req.params.id})
    .then((votedSauce)=>{  
      if(likeStatus === 1){
        sauce.updateOne({_id:req.params.id}, {$push:{usersLiked:liker}, $inc:{likes:1}})
          .then(()=>res.status(201).json({message:'you liked this sauce'}))
          .catch(error=>res.status(400).json({error}))
      } else if (likeStatus === -1) {
        sauce.updateOne({_id:req.params.id}, {$inc:{dislikes:1},$push:{usersDisliked:liker}})
          .then(()=>res.status(201).json({message:'you disliked this sauce'}))
          .catch(error=>res.status(400).json({error}))
      } else if(likeStatus === 0){
          if(votedSauce.usersLiked.includes(liker)){
            sauce.update({ $inc: {likes: -1}, $pull: {usersLiked:liker}})
            .then(()=>res.status(201).json({message:'you un-liked this sauce'}))
            .catch(error=>res.status(400).json({error}))
          } else if (votedSauce.usersDisliked.includes(liker)){
            sauce.updateOne({_id:req.params.id}, { $inc: {dislikes: -1}, $pull: {usersDisliked:liker}})
            .then(()=>res.status(201).json({message:'you un-disliked this sauce'}))
            .catch(error=>res.status(400).json({error}))
          }
      }
    })
    .catch(error=>res.status(400).json({error}))
};

相关问题