我有一个电影评论网站。我的mongo数据库中有两个收藏夹,一个收藏夹用于我的电影评论,另一个收藏夹用于用户提交的评论。
每当用户提交自己的评论时,我都希望在我的评论集合中增加变量userReviewCount。
我正在使用猫鼬并在javascript中运行所有内容:
function saveUserReview(review) {
collections.ReviewModel.findOne(
{ 'filmId': review._filmId.toNumber() },
function(err, result) {
if (err) throw err;
currentCount = result.userReviewCount;
currentCount++;
});
collections.ReviewModel.update(
{ 'filmId': review._filmId.toNumber() },
{ $set: { "userReviewCount": currentCount } },
function(err, res) {
if (err) throw err;
console.log("Result of update:" + res);
});
因此,只要用户提交评论,就会调用此函数。首先,它使用findOne通过其ID查找我的评论,并获取userReviewCount的当前值。然后,将其递增1,并将其添加回集合中。
但是超级奇怪的是,每次我调用该函数时,$ set东西似乎都只能工作。我第一次将其称为变量userReviewCount保持为0,第二次将其称为1,第三次将其保持为1,第四次将其变为2,依此类推。我无法理解它为何如此运行。为了进行调试,我将res输出到控制台,但结果始终是“ update:[object Object]的结果”,这没有任何信息。
有人知道如何调试吗?我已经考虑了一切。
答案 0 :(得分:0)
您在使用异步代码时遇到了问题。
数据库响应后,您正在增加当前计数,但是在增加响应之前,您发送了设置查询
此外,您不需要查询两次,可以从findOne获取结果,进行更改并保存
function saveUserReview(review) {
var query = { 'filmId': review._filmId.toNumber() }
collections.ReviewModel.findOne(query, function(err, result) {
if (err) throw err;
result.userReviewCount++;
// could also be result.set(userReviewCount, result.userReviewCount + 1)
result.save();
});
}
我建议阅读有关javascript的异步特性
此外,您无法调试的原因是要向字符串中添加对象,以便将对象转换为字符串[Object object]并进行打印。正确的方法是console.log("Result of update:", res);
或创建两个不同的console.log