2015-06-27 10 views
10

Sono abbastanza nuovo per nodejs, knex, bookshelf ecc e sto attualmente sviluppando un'applicazione web che si connetterà a un diverso database mysql in base al quale l'utente ha effettuato il login.tentativo di utilizzare node.js e mysql per connettersi a database diversi per utente - preferibilmente utilizzando un pool

La prima connessione funziona correttamente, quindi esco dal logout e nel codice di disconnessione faccio knex.destroy(). Quando vado a riaccedere ottengo un Unhandled rejection Error: There is no pool defined on the current client

Sembra che knex non ricrea una piscina una volta che è stata distrutta, anche se viene reinizializzata.

Qualcuno ha provato questo e sa come farlo?

Ho provato a inizializzare senza un database e ad aggiungerne uno quando l'utente effettua l'accesso ma la connessione non sembra quindi connettersi al database. Ho provato a creare un'istanza di una nuova connessione con il database senza distruggere il precedente, il che si traduce in un utente che utilizza il primo database dell'utente. Distruggere la connessione rimuove le connessioni MySQL e stabilisce anche una nuova connessione con il database giusto ma apparentemente nessun pool.

Dalla lettura sembra che Knex non sia stato progettato per farlo, ma sicuramente ci deve essere un modo per creare una nuova connessione con un nuovo pool?

sto usando il passaporto locale frammenti di codice seguono

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; 

favore aiuto! fammi sapere di quale altro codice potresti aver bisogno.

Qualcuno ha mai fatto questo e se sì, come? Per favore, non ho avuto o trovato alcuna risposta.

+0

Il numero di database da collegare a fisso e conosciuto in anticipo? – HeadCode

+0

Cosa si intende per database diversi per utente? Come i nomi utente che sono iniziati con un ... me gli altri database è per n ... z vuoi dire che il modello degli utenti usa un database e gli altri modelli ne usano un altro?Oppure tutti gli altri modelli utilizzano un database diverso per utente? – JTWebMan

+0

ogni utente ha un database per i propri dati, quando accedono dovrebbero essere in grado di accedere al proprio database. – Peter

risposta

2

Non sono sicuro se questo sarà di aiuto o meno, ma ho ottenuto questa versione ridotta per funzionare. Non ho molta familiarità con knex, ma ho creato due database molto semplici e sono stato in grado di connettermi ad entrambi e ottenere un output semplice.

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

io non sono sicuro che questo è davvero quello che si vuole fare. Cosa succede se due utenti diversi hanno effettuato l'accesso contemporaneamente. Entrambi devono essere in grado di accedere alla loro connessione. Avere diversi database significa che probabilmente dovresti disabilitare il pooling tutti insieme. Nella configurazione è possibile impostare pool: { min: 0, max: 0}. Oppure l'altro modo è che devi tenere un database per ogni utente attualmente loggato e poi, una volta terminato il logout o dopo un certo periodo di tempo, dovresti rilasciare il database senza distruggerlo.

È necessario riflettere seriamente prima di utilizzare un database diverso per ciascun utente. Questo può portare a un sacco di lavoro lungo la strada quando devi migrare migliaia di database.

+0

Sto pensando di tenere una connessione al database per ogni utente attualmente loggato. Non sono sicuro che sia possibile raggiungerlo. Non l'ho guardato per un po '. Ho pensato di inserire ogni nuova connessione in un array o qualcosa e trovare quello giusto quando viene fatta una richiesta. Il processo di pensiero per mantenere un database per utente è quello di mantenere separati i dati, per motivi di sicurezza. – Peter

+0

Sono d'accordo con @JTWebMan su questo. Saranno difficili da gestire database multipli e il fatto che non è possibile effettuare alcuna raccolta di dati utili su database separati (nessun join, ecc.). Ma se insisti, ti ho fornito un esempio funzionante sopra. – HeadCode

+0

@Peter ci sono modi migliori per gestire la sicurezza. Il motivo per cui è così difficile è che questo è un cattivo modello di design. Puoi aggiungere l'id utente su ogni record che è loro e filtrare sempre sull'id utente. È difficile suggerire una soluzione migliore senza conoscere il problema. Forse puoi aggiungere alla domanda quali dati vuoi proteggere. Mantenere un pool di connessioni per ogni utente significa che avrai alcuni problemi di ridimensionamento dopo alcuni 100 utenti. – JTWebMan