Как правильно передать mongoDB в функцию в Node.js - PullRequest
0 голосов
/ 18 июня 2020

Я разрабатываю приложение node.js и передаю mongoDB в функции, поэтому модульное тестирование проще, поскольку я могу имитировать свою производственную mongoDB с помощью тестовой базы данных mongoDB. Однако я не уверен, что делаю это правильно, так как думаю, что могу создать несколько экземпляров клиента;

//db.js

import mongodb from 'mongodb';

export default async function makeDb() {
  const { MongoClient } = mongodb;
  const url = process.env.DB_URL;
  const client = new MongoClient(url,
    {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
  await client.connect();
  const db = await client.db('myDB');
  return db;
}

, а затем я импортирую функцию makeDB и передаю ее в несколько dbHandler;

//authHandler.js

import makeDB from './db'

export default function dbMethods({ makeDB }) {
  const signup = async (username, password) => {
    const db = await makeDB();
    const result = await db
      .collection('users')
      .insertOne({ username, password });

    return result;
  };

  // other methods that also use const db = await makeDB();

  return Object.freeze({
    signup,
    // other methods
  });
}

Помимо authHandler, в моем приложении есть и другие обработчики, которые используют ту же технику .

Создаю ли я десятки экземпляров клиента mongoDB каждый раз, когда делаю const db = makeDB () ? Если да, есть ли лучший способ сделать это

1 Ответ

0 голосов
/ 18 июня 2020

Да, вы создаете несколько клиентов БД. Избежать этого можно так:

let client;
export default async function makeDb() {
  const { MongoClient } = mongodb;
  const url = process.env.DB_URL;

  if (!client) {
    client = new MongoClient(url,
      {
        useNewUrlParser: true,
        useUnifiedTopology: true,
      });
    await client.connect();
  }

  const db = await client.db('myDB');
  return db;
}
...