.save()函数在猫鼬中不起作用

时间:2018-09-16 09:57:22

标签: node.js mongoose

我正在尝试编写一个函数,该函数使用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返回未定义问题出在哪里?

3 个答案:

答案 0 :(得分:1)

您没有检查err变量或find方法的结果;看起来他在您的数据库中找不到该条目,因此引发了错误

编辑:更新后的帖子看起来就像您尝试在数组上调用save方法一样;因此,为了使您的应用正常运行,您必须获取查找的第一个元素,例如:

winner = winner[0];

或者,如果您确定总是会得到一个结果,则将查询更改为findOne()而不是find():

https://mongoosejs.com/docs/api.html#model_Model.findOne

答案 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.
        }
    })