【问题标题】:How to query MongoDB using aysnc/await?如何使用 async/await 查询 MongoDB?
【发布时间】: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@.

我需要有人为我解释这些问题:

  1. 如果我们使用await,为什么代码会立即执行?
  2. Tour.find()确实需要时间来查询数据库,所以我认为我们应该添加await,不是吗?

【问题讨论】:

    标签: node.js mongodb express mongoose async-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() 在等待查询时返回的承诺,您所做的是等待查询结束并返回结果,只需使用不同的变量
    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 2017-09-28
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多