javascript - 更新 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");
});
解决方案
在回答您的问题之前,我想注意您的代码的一些问题。
- 您正在将回调样式函数与异步等待(基于承诺)混合。您在 Rating 上使用 await,为什么不在 History 上也这样做呢?
- 您正在使用一个富有表现力的数据库,它允许您进行复杂的查询,并利用它来发挥您的优势。
- 由于您传递了回调,但尝试
/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')
})
})
});
我没有考虑错误处理,因为这不是这里的范围。总结一下:回调/承诺是异步的,在其范围之外做任何事情都会根据情况在它之前/之后执行,在你的情况下,有时在渲染删除之前完成,有时没有。
推荐阅读
- android - 是什么导致 android.support.v4.app.Fragment.setUserVisibleHint() 崩溃?
- php - 无法使用 Php 和 Curl 运行 Rest API
- redis - redis:使用joblib批量插入
- javascript - 三个js中一行中心点的文字
- arrays - 将数组加载到 sklearn.linear_model
- android - 用户键入时在编辑文本中添加空格。澳大利亚 ABN 号码的格式
- angular - 除非单击选定的选项卡,否则隐藏容器中的角材料垫选项卡组不会显示溢出按钮
- javascript - 用于在文本字段中键入的 Javascript 执行不表现为 sendKeys
- iis - 需要在 IIS 中手动“浏览”才能启动 .net 核心服务
- here-api - here.com api 密钥无法计算矩阵