【发布时间】:2015-06-27 02:05:55
【问题描述】:
我对 nodejs、knex、bookshelf 等还很陌生,目前正在开发一个 Web 应用程序,该应用程序将根据登录的用户连接到不同的 mysql 数据库。
第一个连接工作正常,然后我注销并在注销代码中执行 knex.destroy()。
当我重新登录时,我得到一个
Unhandled rejection Error: There is no pool defined on the current client
似乎 knex 不会重新创建一个池,一旦它被销毁,即使它被重新初始化。
有没有人试过这个并且知道怎么做?
我尝试在没有数据库的情况下进行初始化,并在用户登录时添加一个,但连接似乎并没有连接到数据库。我尝试在不破坏以前的情况下实例化与数据库的新连接,这导致用户使用第一个用户的数据库。销毁连接会删除 MySQL 连接,甚至会与正确的数据库建立新连接,但显然没有池。
从阅读来看,knex 似乎不是为执行此操作而设计的,但肯定有一种方法可以实例化与新池的新连接?
我正在使用本地护照 代码sn-ps跟随
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;
请帮忙! 让我知道您可能还需要什么其他代码。
有没有人这样做过,如果有,怎么做?拜托,我还没有或找到任何答案。
【问题讨论】:
-
要连接的数据库数量是否固定且提前知道?
-
每个用户使用不同的数据库是什么意思?就像以 a...m 开头的用户名和其他数据库用于 n...z 一样,或者您的意思是用户模型使用一个数据库而其他模型使用另一个数据库?还是所有其他模型每个用户都使用不同的数据库?
-
每个用户都有一个数据库来存放他们的数据,当他们登录时应该能够访问他们的数据库。