提问者:小点点

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


我有一个使用mongodb本机驱动程序的Node.js应用程序。在使用NodeV8.9.1将我的应用程序代码迁移到Async/Await的过程中,我正在努力为mongodb查询找到一种优雅的方法。mongodb驱动程序的主要问题是,所有查询都使用回调,其中承诺函数对于异步方法是必需的。

备选方案:

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

对于优雅的高性能方式有什么新鲜的想法吗?


共3个答案

匿名用户

由于所有答案都缺少一些位(catch块,检查客户机不是),所以我提供了自己的解决方案。使用Mongo server V4.0.7和Node JS driver 3.2.2进行了测试。

注意,该示例是一个控制台程序,其中我们在块中关闭到服务器的连接。在web应用程序中,连接被重用。请参阅Node Mongo文档。而且,错误是用诸如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();

匿名用户

编辑:'mongodb'v3.x

根据mongoDB ES6未来您可以使用这种方式;

let MongoClient = require('mongodb').MongoClient;
const connectionString = 'mongodb://localhost:27017';

    (async () => {
        let client = await MongoClient.connect(connectionString,
            { useNewUrlParser: true });

        let db = client.db('dbName');
        try {
           const res = await db.collection("collectionName").updateOne({ 
               "someKey": someValue
           }, { $set: someObj }, { upsert: true });

           console.log(`res => ${JSON.stringify(res)}`);
        }
        finally {
            client.close();
        }
    })()
        .catch(err => console.error(err));

匿名用户

谢了。与ES6:

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

router.get('/', middleWare(async (req, res, next) => {
    const db = await MONGO.connect(url);
    const MyCollection = db.collection('MyCollection');
    const result = await MyCollection.find(query).toArray();
    res.send(result);
}))

相关问题