node.js - 如何正确地将 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 客户端实例?如果是这样,有没有更好的方法来做到这一点
解决方案
是的,您正在创建多个数据库客户端。你可以像这样避免它:
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;
}
推荐阅读
- jinja2 - 过滤可视化中使用的 SQL Lab 查询。使用 Jinja 模板进行过滤
- reactjs - 无法连接到房间:无效的访问令牌颁发者/主题 - Twilio visio 房间问题
- c# - 组合两个表达式(表达式
>) 在一个单一的 - tensorflow-federated - TFF:远程执行器
- docker - 如何在docker上检查正在运行的服务器的日志
- r - 邻接矩阵的顶点坐标;应用于由随机转移矩阵表示的作物轮作
- python - 尽管给出了整数输入,为什么我只得到“非整数”输出?
- php - 如何在 PHP 中按索引对循环进行分组
- amazon-web-services - 如何阻止十月 CMS 使用缓存?
- sql - 合并预言机行