2015-06-27 3 views
10

Я довольно новичок в nodejs, knex, bookshelf и т. Д., И в настоящее время я разрабатываю веб-приложение, которое будет подключаться к другой базе данных mysql на основании которого пользователь вошел в систему.пытается использовать node.js и mysql для подключения к другой базе данных для каждого пользователя - желательно с использованием пула

Первое соединение работает нормально, затем я выхожу из системы и выхожу из кода, который я делаю 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; 

, пожалуйста, помогите! дайте мне знать, какой другой код вам может понадобиться.

Кто-нибудь когда-либо делал это, и если да, то как? Пожалуйста, у меня не было или не было ответов.

+0

Является ли количество баз данных для подключения к фиксированным и известным заблаговременно? – HeadCode

+0

Что означают разные базы данных для пользователя? Как и имена пользователей, которые начинались с ... m, а другие базы данных для n ... z или вы имеете в виду, что модель пользователей использует одну базу данных, а другие модели используют другую?Или все другие модели используют другую базу данных для каждого пользователя? – JTWebMan

+0

каждый пользователь имеет базу данных для своих данных, при входе в систему они должны иметь доступ к своей базе данных. – Peter

ответ

2

Я не уверен, что это поможет или нет, но я получил эту урезанную версию для работы. Я не очень хорошо знаком с 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; 
0

Я не уверен, что это действительно то, что вы хотите сделать. Что делать, если у вас одновременно зарегистрировано два разных пользователя. Оба должны иметь доступ к их соединению. Наличие разных баз данных означает, что вы, вероятно, должны просто отключить объединение. В конфигурации вы можете установить pool: { min: 0, max: 0}. Или, наоборот, вам нужно будет хранить базу данных для каждого пользователя, который в настоящий момент вошел в систему, а затем после выхода из системы или после некоторого периода времени вы должны освободить базу данных, а не уничтожить ее.

Вы должны действительно задуматься, прежде чем использовать другую базу данных для каждого пользователя. Это может привести к кучке работы в будущем, когда вам нужно перенести 1000 баз данных.

+0

Я подумываю о подключении базы данных для каждого пользователя, который в настоящий момент вошел в систему. Я не уверен, что этого можно добиться. Я не смотрел на это некоторое время. Я думал, что, возможно, каждое новое соединение может быть подключено к массиву или что-то в этом роде и найти правильный вариант, когда будет сделан запрос. Мысленный процесс хранения базы данных для каждого пользователя заключается в том, чтобы хранить данные отдельно для целей безопасности. – Peter

+0

Я согласен с @JTWebMan на этом. С несколькими базами данных будет сложно справиться, а также с тем фактом, что вы не можете действительно делать какой-либо полезный сбор данных в отдельных базах данных (нет объединений и т. Д.). Но если вы настаиваете, что я предоставил вам рабочий пример выше. – HeadCode

+0

@Peter есть лучшие способы борьбы с безопасностью. Причина, по которой это так сложно, - это плохой дизайн. Вы можете добавить идентификатор пользователя для каждой записи, которая принадлежит им, и всегда фильтровать идентификатор пользователя. Трудно предложить лучшее решение, не зная проблемы. Возможно, вы можете добавить к вопросу, какие данные вы хотите защитить. Удержание пула соединений для каждого пользователя означает, что у вас будет несколько проблем с масштабированием после нескольких 100 пользователей. – JTWebMan