2015-06-27 7 views
10

Ich bin ziemlich neu zu Nodejs, Knex, Bücherregal usw. und derzeit entwickelt eine Webanwendung, die mit einer anderen MySQL-Datenbank verbinden würde basierend auf dem Benutzer angemeldet.Ich versuche, node.js und mysql verwenden, um eine Verbindung zu verschiedenen Datenbank pro Benutzer - vorzugsweise mit einem Pool

die erste Verbindung funktioniert gut, ich dann ausloggen und im Zeichen aus Code, den ich tue knex.destroy(). Wenn ich in mir ein bekommen anmelden zurück Unhandled rejection Error: There is no pool defined on the current client

Es scheint, dass Knex neu erstellen hat keinen Pool, sobald es sogar zerstört worden ist, wenn es neu initialisiert wird.

Hat jemand versucht, dies und wissen, wie es zu tun?

Ich habe versucht, ohne eine Datenbank zu initialisieren und einen zu addieren, wenn sich der Benutzer anmeldet, aber die Verbindung scheint sich dann nicht mit der Datenbank zu verbinden. Ich habe versucht, eine neue Verbindung mit der Datenbank zu erstellen, ohne die vorherige zu zerstören, was dazu führt, dass der Benutzer die Datenbank des ersten Benutzers verwendet. Destroying die Verbindung der MySQL-Verbindungen entfernt und stellt auch eine neue Verbindung mit der richtigen Datenbank aber anscheinend ohne Pool.

Aus dem Lesen sieht es aus wie Knex wurde nicht dafür entwickelt, aber sicherlich muss es eine Möglichkeit, eine neue Verbindung mit einem neuen Pool instanziieren?

Ich bin mit Pass-local Code-Schnipsel

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; 

bitte helfen Sie folgen! lassen Sie mich wissen, welchen anderen Code Sie möglicherweise benötigen.

Hat jemand das schon gemacht und wenn ja wie? Bitte, ich habe keine Antworten gefunden oder gefunden.

+0

Ist die Anzahl der Datenbanken auf Fest verbinden und vor der Zeit bekannt? – HeadCode

+0

Was bedeuten unterschiedliche Datenbanken pro Benutzer? Wie Benutzernamen, die mit einem ... m begonnen haben, und die anderen Datenbanken sind für n ... z oder meinst du, das Benutzermodell verwendet eine Datenbank und die anderen Modelle verwenden ein anderes?Oder verwenden alle anderen Modelle eine andere Datenbank pro Benutzer? – JTWebMan

+0

Jeder Benutzer hat eine Datenbank für seine Daten. Wenn er sich anmeldet, sollte er auf seine Datenbank zugreifen können. – Peter

Antwort

2

Ich bin mir nicht sicher, ob das hilft oder nicht, aber ich habe diese abgespeckte Version zu arbeiten. Knex ist mir nicht wirklich bekannt, aber ich habe zwei sehr einfache Datenbanken erstellt und konnte mich mit beiden verbinden und eine einfache Ausgabe erhalten.

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

Ich bin wirklich nicht sicher ist, was Sie tun wollen. Was ist, wenn Sie zwei verschiedene Benutzer gleichzeitig angemeldet haben? Beide müssen auf ihre Verbindung zugreifen können. Wenn Sie unterschiedliche Datenbanken haben, sollten Sie das Pooling möglicherweise alle zusammen ausschalten. In der Konfiguration können Sie pool: { min: 0, max: 0} setzen. Oder andersherum wäre es, wenn Sie für jeden aktuell angemeldeten Benutzer eine Datenbank anlegen und nach dem Abmelden oder nach einer gewissen Zeit die Datenbank freigeben und nicht zerstören wollen.

Sie sollten wirklich gründlich überlegen, bevor Sie für jeden Benutzer eine andere Datenbank verwenden. Dies kann eine Menge Arbeit machen, wenn Sie Tausende von Datenbanken migrieren müssen.

+0

Ich denke daran, eine Datenbankverbindung für jeden derzeit angemeldeten Benutzer zu halten. Ich bin nicht sicher, ob das erreicht werden kann. Ich habe das eine Weile nicht angeschaut. Ich dachte, vielleicht jede neue Verbindung in ein Array oder etwas zu setzen und das richtige zu finden, wenn eine Anfrage gestellt wird. Der Gedankenprozess zum Verwalten einer Datenbank pro Benutzer besteht darin, die Daten aus Sicherheitsgründen getrennt zu halten. – Peter

+0

Ich stimme @JTWebMan zu diesem Thema zu. Es wird schwierig sein, mit mehreren Datenbanken umzugehen, und Sie können nicht wirklich nützliche Daten in separaten Datenbanken sammeln (keine Joins usw.). Aber wenn Sie darauf bestehen, habe ich Ihnen oben ein funktionierendes Beispiel gegeben. – HeadCode

+0

@Peter gibt es bessere Möglichkeiten, mit Sicherheit umzugehen. Der Grund dafür ist, dass dies ein schlechtes Designmuster ist. Sie können eine Benutzer-ID für jeden Datensatz hinzufügen, der ihnen gehört, und immer nach Benutzer-ID filtern. Es ist schwierig, eine bessere Lösung vorzuschlagen, ohne das Problem zu kennen. Vielleicht können Sie der Frage hinzufügen, welche Daten Sie sichern möchten. Das Halten eines Verbindungspools für jeden Benutzer bedeutet, dass nach einigen 100 Benutzern einige Skalierungsprobleme auftreten. – JTWebMan