更新 mongodb 条目并非一直有效



我想在历史集合中的索引游戏编号中获取条目。从该条目中,我想获取team1Player1并在评级集合中找到该玩家,然后将他的游戏设置为任意数字。这段代码有时有效,但 idk 是什么让它不起作用

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");
});

在回答你的问题之前,我想指出你的代码的一些问题。

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

让我们在 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')
})
})
});

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

最新更新