尝试使用node.js和mysql连接到每个用户的不同数据库 - 最好使用池

Pet*_*ter 11 node.js knex.js

我是nodejs,knex,bookshelf等的新手,我目前正在开发一个基于用户登录的连接到不同mysql数据库的Web应用程序.

第一个连接工作正常,然后我退出并在注销代码中我做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);
         }
      }
   });
}));
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

请帮忙!让我知道您可能需要的其他代码.

有没有人这样做过,如果有的话怎么样?拜托,我没有或找到任何答案.

Hea*_*ode 2

我不确定这是否有帮助,但我让这个精简版本可以工作。我不太熟悉 knex,但我创建了两个非常简单的数据库,并且能够连接到这两个数据库并获得简单的输出。

索引.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');
Run Code Online (Sandbox Code Playgroud)

数据库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;
Run Code Online (Sandbox Code Playgroud)