我正在尝试编写一个函数,该函数使用node.js和mongoose更新用户的分数。
这是我的代码:
router.post('/submitScore', (req, res) => {
totalScore = Number(req.body.winnerScore) + Number(req.body.loserScore);
// TODO: submit the score and redirect to another page
User.find({teamName: req.body.winnerName}, (err, winner) => {
// TODO: add special bonus for winner!
winner.score = (winner.score / totalScore) * 100;
winner.save((err) => {
if (err) {
console.log(err)
}
});
})
// TODO: add loser function
console.log(typeof Number(req.body.winnerScore))
res.redirect('/admin/');
});
我遇到以下错误:
throw er; // Unhandled 'error' event ^
TypeError:winner.save不是函数
注意,每当我console.log(winner)时,它都会打印以下
[ { score: 0,
_id: 5b963ef5c20ed241b87813bf,
teamName: 'mostafa',
faculty: 'مهندسی کامپیوتر',
email: 'm@m.ir',
password: '$2b$10$OqqagG.cwLE4RpGEn8voBOsHCRENgbivOejK9xmwdQ.TCAaVrYf0u',
__v: 0 } ]
但是winner.score返回未定义问题出在哪里?
答案 0 :(得分:1)
您没有检查err变量或find方法的结果;看起来他在您的数据库中找不到该条目,因此引发了错误
编辑:更新后的帖子看起来就像您尝试在数组上调用save方法一样;因此,为了使您的应用正常运行,您必须获取查找的第一个元素,例如:
winner = winner[0];
或者,如果您确定总是会得到一个结果,则将查询更改为findOne()而不是find():
答案 1 :(得分:1)
请注意,winner
是一个数组,而不是一个对象,如包围在方括号([ ... ]
)中所示。
如果您确定查询最多会产生一个结果,请使用findOne
而不是find
(此外,请不要因为没有错误而假设{{1 }}将被定义:如果查询成功但未产生任何结果,则winner
将是winner
)。
答案 2 :(得分:1)
使用 findOne ,然后保存
User.findOne({teamName: req.body.winnerName}, (err, winner) => {
if(winner) //also check exists.
// TODO: add special bonus for winner!
winner.score = (winner.score / totalScore) * 100;
winner.save((err) => {
if (err) {
console.log(err)
}
});
} else {
//return not exists.
}
})