我目前正在为我的大学学位做一个后端项目,专注于Node.JS,MongoDB和Express,到目前为止,它有点顺利。然而,这个任务(主要是创建一个API)要求我创建一个接受评级的路由,并将其与userId沿着发送到数据库,以使评级唯一。这是工作,但同样的路由还需要我计算一个平均评级,发送到我的数据库中的一个averageRating。我已经成功地发送了星星评级,但我不知道如何分配平均评级。我正在使用一个计算平均值的函数,并试图将其结果作为updateOne()的参数传递,但它不起作用。有人知道是怎么回事吗?代码如下
exports.bookRating = (req, res) => {
Book.findOne({ _id: req.params.id })
.then((book) => {
if (!book) {
const newRating = new Book({
userId: req.auth.userId,
grade: req.body.rating,
});
} else if (req.body.rating < 1 || req.body.rating > 5) {
throw new Error("La note n'est pas valide !");
} else {
const ratings = book.ratings;
if (!ratings.find((rating) => rating.userId === req.auth.userId)) {
const newRating = {
id: req.params.id,
userId: req.auth.userId,
grade: req.body.rating,
};
ratings.push(newRating);
book.save();
const calculatedAverage = calculateAverageRating(ratings);
Book.updateOne(
{ _id: req.params.id },
{ averageRating: calculatedAverage }
)
.save()
.then(() => res.status(200).json({ book }))
.catch((error) =>
res.status(400).json({ error: "Echec de la moyenne" })
);
}
}
})
.catch((error) => res.status(400).json({ error: "une autre erreur" }));
};
function calculateAverageRating(ratings) {
let totalGrades = ratings.reduce((sum, rating) => sum + rating.grade, 0);
return totalGrades / ratings.length;
}
我希望计算出的平均值被分配给数据库中的averageRating字段,但我得到了一个代码400 Bad Request错误。但是,userId/rating对已成功发送到数据库
1条答案
按热度按时间qvtsj1bj1#
您正在尝试使用.updateOne()方法,然后对结果调用.保存(),这不是在Mongoose中更新单个文档的正确方法。相反,您可以使用.findOneAndUpdate()方法来更新现有文档。像这样的东西应该会有用,