一尘不染

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

node.js

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

备择方案:

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

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

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


阅读 225

收藏
2020-07-07

共1个答案

一尘不染

由于所有答案都缺少一些内容(捕获块,请检查客户端是否不是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();
2020-07-07