Mongodb连接对象与可选方法

时间:2018-12-20 08:14:50

标签: javascript mongodb promise

我想创建mongodb对象,该对象将具有连接连接后创建Collection的可选方法。

我有这样的东西(mongo.js):

import url from 'url';
import { MongoClient } from 'mongodb';

const getDbName = mongourl => {
  const mongoPathName = url.parse(mongourl).pathname;
  return mongoPathName.substring(mongoPathName.lastIndexOf('/') + 1);
}

export let db = null;

(async function() {

  const dbURL = process.env.MONGO_URL;
  const dbName = getDbName(dbURL);

  const client = new MongoClient(dbURL, { useNewUrlParser: true });

  try {

    await client.connect();
    db = client.db(dbName);

  } catch (err) {
    console.log(err);
  }

})();

如果我想连接到数据库,我就是这样做:

import { db } from './libs/mongo';

但是我的问题是如何添加可选方法,以便在连接到数据库后可以在其中创建集合? 我想得到这样的东西:

import { db } from './libs/mongo';

db.then(() => { // if db is connected ->
 //createCollection or something else
})

我想通过Promise做到这一点,但我不知道如何做。 我想至少在两个地方使用这个库。在第1步中,与基础连接,在第2个(独立)中连接并创建集合(设置)

1 个答案:

答案 0 :(得分:0)

您的import本身不应引起副作用。

mongo.js模块中,我建议导出一个包含async方法的类或对象以返回数据库连接。

这是我在自己的一个项目中使用的方法,在该方法中,构造函数返回一个新对象,该对象最初仅具有connect方法,该方法在被调用时将附加的与数据库相关的功能附加到该对象

class Database {

    constructor(settings) {
        this.connect = async () => {
            let db = await MongoClient.connect(url, settings);

            this.someDbMethod = () => {
                return db.collection('foo').find(...);
            }

            return this;
        }
    }
}

用法:

let db = await new Database(url, settings).connect();
let rec = await db.someDbMethod();

构造函数不能异步,因此为什么我使用辅助函数执行实际连接。