(请在下面的回答帖中找到我的解决方案)
我今天的问题是关于一个喜欢/不喜欢的简单系统,这个系统有nodeJ,数据在MongoDB上。
您的情况如何?
1.我已经得到了一个API后端的实现。前端已经完成了,不要再碰了。
- 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类似,但那里提供的解决方案对我没有太大帮助(顺便说一句,情况也一样)
你在这里,我感谢你阅读我的长帖子,并为任何帮助,你可能能够提供。
1条答案
按热度按时间fv2wmkja1#
我终于解决了我自己的问题,并想与大家分享。这不是一个非常优雅也不是完美的动态解决方案,但至少它帮助我解决了我的问题。理想情况下,我希望通过应用usersLiked和usersDisliked数组动态地增加喜欢和不喜欢计数器。length,但如果有人有想法,欢迎。废话少说,下面是代码: