使用MongoDb的Like/Dislike系统



我正在API上开发一个喜欢/不喜欢的系统,该系统与mongoDB和nodejs一起工作,用户应该能够执行以下操作:

  • 喜欢酱汁一次(Like=1(,并将用户id添加到";usersLiked";阵列
  • 取消他的点赞(点赞=0(并从"点赞"中删除用户id;usersLiked";阵列
  • 不喜欢酱汁一次(like=-1(并将用户id添加到数组"中;users不喜欢">
  • 取消他的不喜欢(like=0(并且假定从"喜欢"中删除用户id;users不喜欢";阵列

喜欢/不喜欢的系统逻辑

我设法让用户喜欢酱汁,取消了他对酱汁的喜欢和不喜欢。

但我在取消不喜欢时被完全阻止了,因为当我试图在我们必须取消喜欢/不喜欢的情况下再次使用updateOne方法时,我出现了以下错误:

将标头发送到客户端后无法设置标头

如何改进代码?

我正在一点一点地学习如何使用后端命令,现在我面临着一堵墙。

您得到的错误:Cannot set headers after they are sent to the client,是因为您正试图为同一请求发送两个HTTP响应,在此块中:

if(likeStatus === 0) {
Sauces.updateOne({_id: req.params.id}, {$inc:{likes:-1}, $pull: {usersLiked:userIdentifiant}})
.then(() => res.status(201).json({message: "Like has been canceled"}))
.catch(error => res.status(400).json(error))
Sauces.updateOne({_id: req.params.id}, {$inc:{dislikes:+1}, $pull: {usersDisliked:userIdentifiant}})
.then(() => res.status(201).json({message: "Dislike has been canceled"}))
.catch(error => res.status(400).json(error))
}

您应该等待更新操作完成,然后发送一个响应。例如,您可以将承诺链接如下:

if (likeStatus === 0) {
Sauces.updateOne({ _id: req.params.id }, { $inc: { likes: -1 }, $pull: { usersLiked: userIdentifiant } })
.then(() => {
return Sauces.updateOne(
{ _id: req.params.id },
{ $inc: { dislikes: +1 }, $pull: { usersDisliked: userIdentifiant } }
);
})
.then(() => {
res.status(201).json({ message: ['Like has been canceled', 'Dislike has been canceled'] });
})
.catch((error) => res.status(400).json(error));
}

或者更好地使用Promise.all((并行运行它们

最新更新