如何将 async-await 与 MongoClient 一起使用

bal*_*afi 7 mongodb node.js async-await

当我运行它时(使用带有 --harmony 的节点 v7.5.0):

var MongoClient = require('mongodb').MongoClient,
var url = "mongodb://localhost:27017/myDB";

var test = await MongoClient.connect(url);
module.exports = test;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

var test = await MongoClient.connect(url);
             ^^^^^^^^^^^
SyntaxError: Unexpected identifier
Run Code Online (Sandbox Code Playgroud)

MongoClient.connect(url) 确实返回了一个承诺

我最终想要实现的是创建一个节点模块,该模块将连接到 mondoDB 并且可以像以下示例一样使用:

 var db = require('../utils/db');  //<-- this is what I want to create above
 col = db.collection('myCollection');

 module.exports.create = async fuction(data) {
   return await col.insertOne(data);
 }
Run Code Online (Sandbox Code Playgroud)

有什么建议?

lus*_*chn 8

我是这样解决的,只打开一个连接:

数据库.js

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

let db;

const loadDB = async () => {
    if (db) {
        return db;
    }
    try {
        const client = await MongoClient.connect('mongodb://localhost:27017/dbname');
        db = client.db('dbname');
    } catch (err) {
        Raven.captureException(err);
    }
    return db;
};

module.exports = loadDB;
Run Code Online (Sandbox Code Playgroud)

索引.js

const loadDB = require('./db');

const db = await loadDB();
await db.collection('some_collection').insertOne(...);
Run Code Online (Sandbox Code Playgroud)


小智 5

将它包装在异步函数中怎么样?

var MongoClient = require('mongodb').MongoClient,
var url = "mongodb://localhost:27017/myDB";

var test = async function () {
  return await MongoClient.connect(url);
}

module.exports = test;
Run Code Online (Sandbox Code Playgroud)


Zla*_*tko 1

您的模块包装器也是异步函数吗?您需要await将关键字放在异步函数中。