簡體   English   中英

如何使用全局重用 mongo 客戶端,最佳實踐

[英]How to reuse mongo client using globals, best practices

所以,我已經閱讀了 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 客戶端,並且只有一次,因此我創建了這個 index.js(應用程序的入口點)文件,該文件需要典型的 app.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}...`));
});

現在,為了讓我在任何我想進行查詢或其他任何地方重用該數據庫,最佳實踐是什么? 我怎樣才能在全球范圍內添加它? 全局添加它會影響性能還是不好的做法?

我見過其他示例,其中人們使用 class 執行這兩項任務,但同樣都在同一個文件中,而不是使用導出或全局。

最后一個問題,我應該在哪里以及為什么要關閉數據庫客戶端連接。

謝謝你。

我認為將數據庫連接 object 添加到global object 效果很好。 如果您擔心性能,只需將全局變量重新分配給本地變量。 //dbconnection.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();
  });
};

只需在您的根應用程序文件中使用它,一旦添加到文件中,db 連接應該在項目中的其他文件中全局可用。 //server.js

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM