11

私は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);
         }
      }
   });
}));

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;

助けてください!他に必要なコードを教えてください。

誰かがこれをやったことがありますか?どうか、私は答えを持っていないか、見つけていません。

4

2 に答える 2

2

これが役立つかどうかはわかりませんが、この簡素化されたバージョンが機能するようになりました。私は knex にはあまり詳しくありませんが、2 つの非常に単純なデータベースを作成し、両方に接続して単純な出力を得ることができました。

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;
于 2016-02-11T07:05:50.400 に答える
0

これが本当にあなたがやりたいことかどうかはわかりません。2 人の異なるユーザーが同時にログインしている場合はどうなりますか。どちらも接続にアクセスできる必要があります。異なるデータベースを使用するということは、おそらくプーリングをすべて一緒にオフにする必要があることを意味します。設定で設定できますpool: { min: 0, max: 0}。または、現在ログインしている各ユーザーのデータベースを保持する必要があり、ログアウト後または一定期間後に、データベースを破棄せずに解放する必要があります。

ユーザーごとに異なるデータベースを使用する前に、十分に検討する必要があります。これは、数千のデータベースを移行する必要がある場合に、今後多くの作業が必要になる可能性があります。

于 2016-02-18T02:22:01.970 に答える