如何使用全局变量重用 mongo 客户端,最佳实践



所以,我在StackOverflow中阅读了其他主题,这些主题试图触及这个问题,但没有明确的解决方案。

首先,我为 mongo 客户端创建了一个从中导出的配置文件。

const { MongoClient } = require('mongodb');
const authMechanism = 'SCRAM-SHA-1';
const user = encodeURIComponent(process.env.MONGODB_USER);
const password = encodeURIComponent(process.env.MONGODB_PASSWORD);
const uri = `mongodb://${user}:${password}@${process.env.MONGODB_URI}?authMechanism=${authMechanism}`;
const client = new MongoClient(uri, {
useUnifiedTopology: true,
useNewUrlParser: true,
loggerLevel: 'info',
});
module.exports = client;

从那里我了解到,在你监听你的应用程序之前,你必须让 mongo 客户端初始化一次,而且只有一次,因此我创建了这个索引.js(应用程序的入口点(文件,该文件需要典型的应用程序.js所有节点配置都在哪里。

const app = require('./app');
const db = require('../configs/db/db-config');
const port = process.env.PORT;
db.connect((err, client) => {
if (err) {
throw err;
}
const database = client.db('dbnamegoeshere');
app.listen(port, () => console.log(`Listening on port ${port}...`));
});

现在,为了让我可以在我想进行查询或其他任何地方重用该数据库,最佳实践是什么?如何全局添加它?全局添加它会影响性能还是是一种不好的做法?

我见过其他例子,其中人们使用类执行这两个任务,但再次都在同一个文件中,而不是使用导出或全局。

最后一个问题,我应该在哪里以及为什么要关闭数据库客户端连接。

谢谢。

我认为将数据库连接对象添加到global对象可以完美地工作。如果您担心性能,只需将全局变量重新分配给本地变量即可。 数据库连接.js

const debug = require('debug')('someapp:mongo');
const mongoClient = require('mongodb').MongoClient;
const mongoOptions = {};
const mongoUrl = process.env.MONGO_URL || "mongodb://localhost:27017/dbname";
function callback(err, r){
debug("callback: ", err, r);
};
module.exports = function () {
mongoClient.connect(mongoUrl, mongoOptions, (err, client) => {
if(err){
debug("MongoDB connection error: ", err);
throw err;
};
const db = global.db = client.db();
});
};

只需在根应用程序文件中这样使用它,一旦添加到文件中,数据库连接应该在项目中的其他文件中全局可用。 服务器.js

require("./dbconnection")();
const userDB = global.db.collection("Users");
userDB.find({}).toArray((err, items)=>{});

最新更新