首页 > 解决方案 > 更新 mongodb 条目并非一直有效

问题描述

我想在历史集合中的 index gameNumber 处获取条目。从该条目中,我想获取 team1Player1 并在评级集合中找到该玩家,然后将他的游戏设置为任意数字。此代码有时有效,但不知道是什么使它不起作用

 app.post("/delete",  function (req, res) {
        var gameNumber = req.body.test;

        History.find({},  async function (err, historyRecords) {
            if (err) {
                console.log(err);
                return;
            }

             await Rating.updateOne({name: historyRecords.reverse()[gameNumber-1].team1Player1}, { games: 9999});
        })
       // res.redirect("/delete");
    });

标签: javascriptmongodbmongoose

解决方案


在回答您的问题之前,我想注意您的代码的一些问题。

  1. 您正在将回调样式函数与异步等待(基于承诺)混合。您在 Rating 上使用 await,为什么不在 History 上也这样做呢?
  2. 您正在使用一个富有表现力的数据库,它允许您进行复杂的查询,并利用它来发挥您的优势。
  3. 由于您传递了回调,但尝试/delete在最后呈现,由于回调异步性质, /delete 将在调用回调之前执行。为了使您的代码完成,您可以在所有内容上采用完整的回调样式,或者基于 Promise,或者当然是异步等待,这是 Promise 之上的语法糖。

让我们在数据库中查询 index: 处的列表index,注意我使用了限制。在您的示例中,您将所有这些都放入内存中,既浪费资源+网络带宽,又总是限制您的查询!

这是异步等待的示例:

app.post("/delete", async function (req, res, next) {
  var gameNumber = req.body.test

  const [ gameRetrieved ] = await History.find({ gameNumber }).limit(1)
  await Rating.updateOne({ name: gameRetrieved.team1Player1 }, { games: 9999 })
});

这是一个带有回调的示例:

app.post("/delete", async function (req, res, next) {
  var gameNumber = req.body.test
  return History.find({ gameNumber }).limit(1).exec((err, [ gameRetrieved ]) => {
    return Rating.updateOne({ name: gameRetrieved.team1Player1 }, { games: 9999 }).exec((err, rating)=>{
      res.render('/delete')
    })
  })
});

我没有考虑错误处理,因为这不是这里的范围。总结一下:回调/承诺是异步的,在其范围之外做任何事情都会根据情况在它之前/之后执行,在你的情况下,有时在渲染删除之前完成,有时没有。


推荐阅读