如何使用 async/await 查询 MongoDB?
Posted
技术标签:
【中文标题】如何使用 async/await 查询 MongoDB?【英文标题】:How to query MongoDB using aysnc/await? 【发布时间】:2022-01-11 03:47:02 【问题描述】:所以我正在学习 Udemy 的课程,学习使用 Node/Express/MongoDB 和使用 mongoose 与数据库交互的 Web 开发。
我参加了一个讲座,讲师开始解释如何查询数据库,所以这里创建了一个猫鼬模型并将其命名为Tour
,并在控制器文件中编写了这个来查询数据我们已经像这样导入了:
exports.getAllTours = async (req, res) =>
try
const queryObj = ...req.query ;
const exludedFields = ["sort", "limit", "page", "fields"];
exludedFields.forEach(el => delete queryObj[el]);
const query = Tour.find(queryObj);
const tours = await query
res.status(200).json(
status: 'success',
data:
tours: tours
)
catch (err)
res.status(404).json(
status: 'fail',
message: err.message
);
从上面的代码中可以看出,我们使用处理函数getAllTours
来获取所有通过它处理这条路线app.get('/api/v1/tours/')
的方式。
在讲座开始时,查询代码是这样的:const query = await Tour.find(queryObj);
,然后他删除了 await
关键字,看起来像上面的代码,他后来为 tours 对象添加了 await
关键字。
讲师解释说,如果我们在查询中使用 await 像 const query = await Tour.find(queryObj);
那么代码将立即执行,然后我们将无法在查询上链接其他方法,例如 .where()
或 .@ 987654330@.
我需要有人为我解释这些问题:
-
如果我们使用
await
,为什么代码会立即执行?
Tour.find()
确实需要时间来查询数据库,所以我认为我们应该添加await
,不是吗?
【问题讨论】:
【参考方案1】:Tour.find()
返回一个 promise(是一个异步调用),在它前面添加 await 将等到 promise 被解析并返回它的结果。
如果您想在执行 find 之后执行 where() 您可以在执行查询后执行此操作,因为您将在该对象中获得结果你的情况是 tours 对象。
老实说,我更喜欢 const tours = await Tour.find()
你保存一个有点不必要的变量,如果你想捕捉承诺的错误或类似的东西,这是必要的。
在您的情况下,您使用 try catch,因此如果查询发生问题(连接问题或其他问题),错误将转到 catch 块
【讨论】:
Tour.find() 需要时间来执行,所以我认为我们必须在之前添加 await 对吗?在上面的代码中,他简单地删除了它,为什么?我不想将 .where() 或 .equal() 之类的方法链接到它,我很惊讶他删除了 await。 是的,Tour.find() 需要一些时间才能进入数据库并检索数据。所以 await Tour.find() 就可以了。如果这回答了您的问题,请将其标记为已回答:) 这就是 Diego 的重点,他删除了它!怎么样? 查询变量具有 Tour.find() 在等待查询时返回的承诺,您所做的是等待查询结束并返回结果,只需使用不同的变量以上是关于如何使用 async/await 查询 MongoDB?的主要内容,如果未能解决你的问题,请参考以下文章
使用 async / await 在 firebase 中运行查询
将 Async/Await 与 node-postgres 一起使用
在 express (async/await) 中使用一个 mongoose 查询的输出作为另一个查询的输入
使用 async/await 时,Firebase Cloud Firestore 查询返回 Promise <pending> 而不是已完成