【问题标题】:trying to use node.js and mysql to connect to different database per user - preferably using a pool尝试使用 node.js 和 mysql 连接到每个用户的不同数据库 - 最好使用池
【发布时间】: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 一样,或者您的意思是用户模型使用一个数据库而其他模型使用另一个数据库?还是所有其他模型每个用户都使用不同的数据库?
  • 每个用户都有一个数据库来存放他们的数据,当他们登录时应该能够访问他们的数据库。

标签: node.js knex.js


【解决方案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 个数据库时,这可能会导致大量工作。

    【讨论】:

    • 我正在考虑为当前登录的每个用户建立一个数据库连接。我不确定是否可以实现。我有一段时间没看这个了。我想也许将每个新连接放入一个数组或其他东西中,并在发出请求时找到正确的连接。为每个用户保留一个数据库的思考过程是为了安全起见将数据分开。
    • 我同意@JTWebMan 在这一点上。多个数据库将很难处理,而且您实际上无法在单独的数据库上进行任何有用的数据收集(没有连接等)。但是,如果您坚持我确实为您提供了上面的工作示例。
    • @Peter 有更好的方法来处理安全问题。这很难的原因是这是一个糟糕的设计模式。您可以在他们的每条记录上添加用户 ID,并始终过滤用户 ID。在不知道问题的情况下很难提出更好的解决方案。也许您可以在问题中添加您想要保护哪些数据。为每个用户保留一个连接池意味着在 100 个用户之后您将遇到一些扩展问题。
    • @HeadCode 目前我无法让您的解决方案与我的代码一起使用。
    猜你喜欢
    • 2018-10-14
    • 2011-10-06
    • 2018-12-12
    • 2012-06-15
    • 1970-01-01
    • 2016-03-22
    • 2019-07-04
    • 1970-01-01
    相关资源
    最近更新 更多