Mongodb подключить объект с дополнительным методом - PullRequest
0 голосов
/ 20 декабря 2018

Я хотел бы создать объект 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 соединяем с базой, во втором (отдельно) соединяем и создаем коллекции (настройка)

1 Ответ

0 голосов
/ 20 декабря 2018

Ваш 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();

Конструктор не может быть асинхронным, поэтому я использую вспомогательную функцию для выполнения фактического соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...