[英]Like/Dislike System with NodeJS
(請在下面的回答帖子中找到我的解決方案)
希望你過得好。 我今天的問題是關於一個喜歡/不喜歡帶有nodeJs的簡單系統,數據在MongoDB上。
我得到了 API 后端的實現。 前端已經做好了,不用動了。
API 的目的是允許人們發布帶有一系列參數的辣醬。 在此開發階段,每個用戶都必須登錄才能執行任何操作。 在任何頁面上執行的任何刷新都會將用戶直接送回登錄頁面。
我正在完成我需要完成的最后一項任務:為“喜歡/不喜歡”的簡單系統實現一條路線。 該系統具有以下設置:
如果用戶點擊“贊”,前端發送一個“1”數值(以下稱為“likeStatus”)
如果用戶點擊“拇指向下”,前端會發送一個“-1”,如 Status
如果用戶取消點擊他們的喜歡/不喜歡,前端發送一個“0” likeStatus
當用戶點擊任一拇指時,用戶的 ID 將存儲在對象模型中內置的兩個數組之一中:usersLiked 或 usersDisliked,具體取決於用戶的選擇。 請注意,這兩個數組都包含在“sauce”模型中,因此它們不會出現在用戶模型中。
在前端,當用戶點擊任何一個拇指時,另一個拇指是灰色的,以防止他們點擊它。 用戶必須取消單擊他們的初始選擇才能選擇另一個。
我的問題是,當用戶從“1”或“-1”返回到“0(零)”時,我無法跟蹤用戶的取消點擊。 那是因為我不知道如何檢查用戶在歸零之前的位置。 對我來說重要的是要確保從正確的數組中刪除他並減少正確的計數器而不是兩者都或錯誤的計數器。
在嘗試了我在下面描述的內容之后,我正在尋找一種方法來檢查:
要么
我想使用 if/else 鏈來檢查 likeStatus 並搜索數組 usersLiked 和 usersDisliked 以查看 userId(此處稱為“liker”)是否在其中。 如果它在 usersLiked 中,那么我可以遞減 likes 計數器,如果 id 在 userDisliked 中則相反。 但是兩個數組都被視為“未定義”,因此無法讀取。
到目前為止,我已經構建了類似/不同路線的完整代碼:
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}})
}
}
}
這是“sauce”模型,它的末尾有兩個數組:
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);
這個問題與這個問題相呼應,但那里提供的解決方案對我幫助不大(順便說一句,情況相同)
好了,感謝您閱讀我的長篇文章,感謝您提供的任何幫助。
我終於解決了自己的問題,並認為我可以與大家分享。 這不是一個非常優雅也不是完美動態的解決方案,但它至少幫助我解決了我的問題。 理想情況下,我希望通過應用usersLiked
和usersDisliked
array.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({ _id: req.params.id }, { $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 }))
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.