当前位置: 首页 > 面试题库 >

Node.js mongodb驱动程序异步/等待查询

洪高刚
2023-03-14
问题内容

我有一个使用mongodb本机驱动程序的node.js应用程序。在使用节点v8.9.1将应用程序代码迁移到异步/等待的过程中,我努力寻找一种适合mongodb查询的好方法。mongodb驱动程序的主要问题是,所有查询都使用回调,其中对异步方法来说,promise函数是必需的。

备择方案:

  • 猫鼬 -承诺不赞成使用查询,它会强制使用Schema模型,这对我的应用程序来说有点开销。
  • mongoist- 据说很棒,因为它的构建考虑了异步/等待并完全承诺,但是与mongodb的SSL连接错误和文档 不完善 -使我脱离了该解决方案。

我成功以一种优雅的方式成功实现的唯一解决方法是,使用 回调承诺 npm包将mongodb驱动程序API转换为完全承诺。

关于优雅的高性能方式的任何新想法?


问题答案:

由于所有答案都缺少一些内容(捕获块,请检查客户端是否不是null),因此我提供了自己的解决方案。已在Mongo服务器v4.0.7和Node
JS驱动程序3.2.2中进行了测试

注意,该示例是一个控制台程序,在该程序段中,我们关闭了与服务器的连接finally。在Web应用程序中,连接被重用。请参阅Node Mongo
docs
。另外,错误是使用Winston或Morgan等库记录的,而不是控制台记录的。

const MongoClient = require('mongodb').MongoClient;

const url = 'mongodb://localhost:27017';

async function findOne() {

    const client = await MongoClient.connect(url, { useNewUrlParser: true })
        .catch(err => { console.log(err); });

    if (!client) {
        return;
    }

    try {

        const db = client.db("testdb");

        let collection = db.collection('cars');

        let query = { name: 'Volkswagen' }

        let res = await collection.findOne(query);

        console.log(res);

    } catch (err) {

        console.log(err);
    } finally {

        client.close();
    }
}

findOne();


 类似资料:
  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 我有一个带有可单击列标题的表。第一次单击时,列应按升序排序,第二次单击时,列应按降序排序。排序已使用异步回发更新面板实现(我不知道它是如何完成的,它是一个aspx页面)。我想使用Selenium Webdrive自动执行排序功能。我如何为页面实现WAIT条件,其中页面不会被重新加载,但只会重新加载表内容。waitForElementPresent不起作用,因为单击标题时不会显示或隐藏新元素。PS:

  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似

  • 正在研究尝试理解显式等待的方法。 所以单选按钮被点击后,输入形式发生了变化,所以我把给它一个时间元素出现,否则会出错“元素不可见......”。所以我认为现在是理解显式等待的好时机,因为我需要等到元素出现。 但出现错误“Selenium::WebDriver::error::ElementNotVisibleError:Element当前不可见,因此可能无法与之交互”。为什么这段代码不等到元素出现

  • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?

  • 问题内容: 我可以长时间等待Selenium Web Driver吗? 即使我可以像下面那样设置隐式等待命令,它也不会等待我给定的时间。 这里有什么问题吗? 就我而言,我需要执行一个测试用例并等待4分钟,然后执行下一个测试用例。 我在这里使用Java。 问题答案: 其实这不是我的答案,两天前我在这里看到了这个答案,但是我没有时间应用它。今天我尝试了,这就是我想要的。 不幸的是,现在我在这里看不到该