首页 > 解决方案 > 如何正确地将 mongoDB 传递给 Node.js 中的函数

问题描述

我正在开发一个 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,我的应用程序中还有其他使用相同技术的处理程序。

每次执行const db = makeDB()时,我是否都会创建数十个 mongoDB 客户端实例?如果是这样,有没有更好的方法来做到这一点

标签: node.jsmongodbarchitecture

解决方案


是的,您正在创建多个数据库客户端。你可以像这样避免它:

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;
}

推荐阅读