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

我是相当新的nodejs,knex,书架等,目前正在开发一个networking应用程序,将连接到一个不同的mysql数据库基于哪个用户login。

第一个连接工作正常,然后我注销,并在退出代码我做knex.destroy()。 当我去login时,我得到一个Unhandled rejection Error: There is no pool defined on the current client

看起来knex不会重新创build池,即使它被重新初始化也不会被销毁。

有没有人试过这个,知道怎么做?

我已经尝试初始化没有数据库,并添加一个当用户login,但连接似乎没有连接到数据库。 我已经尝试实例化与数据库的新连接而不破坏以前,这导致用户使用第一个用户的数据库。 销毁连接将删除MySQL连接,甚至与正确的数据库build立新的连接,但显然没有池。

从阅读它看起来像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; 

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

有没有人曾经这样做,如果是这样的话? 请,我还没有find任何答案。

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

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; 

我不确定这真的是你想要做的。 如果您有两个不同的用户同时login,该怎么办? 两者都需要能够访问他们的连接。 拥有不同的数据库意味着你可能应该把ether关在一起。 在configuration中你可以设置pool: { min: 0, max: 0} 。 或者另一种方法是,您需要为当前login的每个用户保留一个数据库,然后一次登出,或者在一段时间之后,您应该释放数据库而不是销毁它。

在为每个用户使用不同的数据库之前,你应该认真思考。 当你必须迁移数千个数据库时,这可能会导致大量的工作。