Пытаясь использовать node.js и mysql для подключения к другой базе данных для каждого пользователя - предпочтительно используя пул

Я новичок в nodejs, knex, bookshelf и т.д. и в настоящее время разрабатываю веб-приложение, которое будет подключаться к другой базе данных mysql на основе того, какой пользователь зарегистрирован.

Первое соединение работает отлично, я затем выхожу из системы и в коде выхода я делаю knex.destroy(). Когда я иду, чтобы зайти в систему, я получаю   Unhandled rejection Error: There is no pool defined on the current client

Кажется, что knex не воссоздает пул после того, как он был уничтожен, даже если он будет повторно инициализирован.

Кто-нибудь пробовал это и знал, как это сделать?

Я попытался инициализировать без базы данных и добавить ее, когда пользователь входит в систему, но соединение, похоже, не подключается к базе данных. Я попытался создать новое соединение с базой данных, не разрушая предыдущее, что приводит к тому, что пользователь использует первую пользовательскую базу данных. Уничтожение соединения удаляет соединения MySQL и даже устанавливает новое соединение с правой базой данных, но, по-видимому, нет пула.

Из чтения это похоже, что knex не был предназначен для этого, но, конечно, должен быть способ создать новое соединение с новым пулом?

Я использую паспорт-локальный фрагменты кода следуют

passport.use(new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password'
  },
  function(email, password, done) {
    new userModel.User({email: email}).fetch().then(function(data) {
      var user = data;
      if(user === null) {
         return done(null, false, {message: 'Invalid username or password'});
      } else {
         user = data.toJSON();
         if(!bcrypt.compareSync(password, user.password)) {
            return done(null, false, {message: 'Invalid username or password'});
         } else {
             ctrl = new DB();
             ctrl.connect(user.db);
             dbModel = require('../server/models/dbModel');
             return done(null, user);
         }
      }
   });
}));

DB.js

function DB(){

}


DB.prototype.connect = function (db){   
    if (db !== "crm" && db !== null){
        db = "crm-" + db;
    }

    DB.knex = require('knex')({
        client: 'mysql',
        connection:{
            host: 'localhost',  // your host
            user: MYSQL_USR, // your database user
            password: MYSQL_PWD, // your database password
            database: db,
            charset: 'UTF8_GENERAL_CI' //,
    //      debug : true
        }
    });

    DB.bookshelf = require('bookshelf')(DB.knex);
};

DB.prototype.destroy = function (){
    DB.knex.destroy().then(console.log("destroyed"));
};

module.exports = DB;

Пожалуйста, помогите! дайте мне знать, какой другой код вам может понадобиться.

Кто-нибудь когда-либо делал это, и если да, то как? Пожалуйста, у меня не было или не было ответов.

Ответ 1

Я не уверен, поможет ли это или нет, но я получил эту урезанную версию для работы. Я не очень хорошо знаком с knex, но создал две очень простые базы данных, и мне удалось подключиться к ним и получить простой вывод.

index.js

var DB = require('./DB');

function userConnect(db_name){
    var db = new DB();
    var knex = db.connect(db_name);

    knex.select('color').from('test').then(function(result){
        console.log(result);
        knex.destroy();
    });
}

userConnect('db_one');
userConnect('db_two');

DB.js

function DB(){

}


DB.prototype.connect = function (db){   
    return require('knex')({
        client: 'mysql',
        connection:{
            host: MYSQL_HOST,  // your host
            user: MYSQL_USER, // your database user
            password: MYSQL_PASSWORD, // your database password
            database: db
        }
    });
};

module.exports = DB;

Ответ 2

Я не уверен, что это действительно то, что вы хотите сделать. Что делать, если у вас одновременно зарегистрировано два разных пользователя. Оба должны иметь доступ к их соединению. Наличие разных баз данных означает, что вы, вероятно, должны просто отключить объединение. В конфигурации вы можете установить pool: { min: 0, max: 0}. Или, наоборот, вам нужно будет хранить базу данных для каждого пользователя, который в настоящий момент вошел в систему, а затем после выхода из системы или после некоторого периода времени вы должны освободить базу данных, а не уничтожить ее.

Вы должны действительно задуматься, прежде чем использовать другую базу данных для каждого пользователя. Это может привести к кучке работы в будущем, когда вам нужно перенести 1000 баз данных.