Открыть подключение к БД только один раз для всех запросов

В приведенном ниже коде я пытаюсь открыть соединение с БД перед запросом «/ post». Я могу решить проблему ниже с помощью глобального соединения, но есть ли какой-либо другой способ сделать это, просто привязав соединение db к текущему запросу.

//Model.js
function DB(){
    this.DBConn (req, res, next) {
        var conn = <db connection string>;
        pg.connect(conn, function (err, client) {
        req.db = client;
        })
    this.create (req, res, next) {
        // Using req.db.query(), to execute INSERT query
        }
    }
}
//server.js
var DB = require('./model.js');
var app = express.Router();
// Open DB connection
new DB.DBConn(); //How to pass request in this function
app.post('/post', DB.create);

1 ответ

  1. предполагая, что вы используете Express 4, я бы предложил использовать объект маршрутизатора вместо приложения. Но независимо от этого, если вы сделаете модуль для вашей БД, он будет держать экземпляр внутри него, просто вытащите образец из моего репозитория github здесь .

    Если вы посмотрите на него, вы заметите, что если вы сделаете базу данных модулем, то у вас есть функция инициализации, которая вызывается, когда ваше приложение создается, это дает ему абстракцию, которая должна следовать схеме архитектуры micro service наряду с предоставлением вам одного вызова соединения, чтобы вы не постоянно закрывали/открывали.

    ниже представлена база данных.JS файл

    var mongodb = require('mongodb');
    
    var uri = 'some database connection string for mongodb ';
    
    function initilizeDb(cb) {
      mongodb.connect(uri, function(err, db) {
        if (err) {
          cb(err);
          return;
        }
    
        exports.db = db; //this is the part you need to do in sql connection or w.e after you get the async connection handler.
        cb(null);
      });
    };
    
    exports.initDb = initilizeDb;

    как вы можете видеть, мы экспортируем функцию initialDb и экспорт.db внутри инициализированной функции. все модули имеют общий экземпляр с одним и тем же модулем, поэтому ссылка на БД является допустимой.

    нет никаких причин продолжать передавать экземпляр, он просто приносит слои, чтобы следить за Когда вы рефакторинг или ищет ошибки. Тезисы как можно больше-в пределах разумного.