2012-10-26 17 views
6

Sto cercando qualche direzione qui da alcuni programmatori di node.js stagionati. Il più grande problema che sto incontrando è passare le variabili in moduli separati. Per esempio nel mio server.js Ho il seguente:node.js che passa le variabili

var db = mongoose.createConnection('localhost','test'); 

Ora io non sono in esecuzione i miei percorsi all'interno del file server.js sono separati in là propri file. Così, per un esempio di blog potrebbe essere simile a questo:

app.get('/blog/post/:id',function(req,res){ 
    //do something here 
} 

Ora, questo è dove il problema entra in gioco io non voglio avere per impostare una connessione al database in ciascuno dei miei percorsi e per non parlare penserei. che farebbe un sacco di connessioni. Come faccio a gestirlo, c'è un esempio di applicazione "REAL WORLD" là fuori perché non riesco a trovare nulla su questo e so che le persone hanno dovuto avere questo problema prima. So che il nodo memorizza nella cache i moduli ma non posso immaginare che memorizzerebbe nella cache la connessione dato che era nel suo modulo. Ho creato un modulo di configurazione che contiene solo la configurazione del sito, quindi richiedere questo in cui ho bisogno non è un problema. Immagino ci siano altre cose con cui vorrò farlo, quindi sarebbe meglio capirlo subito.

Qualsiasi aiuto è apprezzato.

risposta

3

Ecco cosa faccio nella mia app per il mondo reale.

Ho un modulo denominato redis (che è il database che sto utilizzando). Contiene il seguente codice:

var store; 

exports.store = store = redis.createClient(config.port, config.url); 

Così, posso accedere direttamente al client, se necessario. Non lo faccio quasi mai. Lo stesso modulo contiene codice come questo:

exports.getData = function(dataID, callback){ 

    var key = DATA_STORE_PREFIX; 

    try{ 
     store.hget(key, dataID, callback); 
    } catch(err){ 
     callback(err); 
    } 
} 

utilizzo questa includendo il modulo redis in uno o più moduli di rotta e chiamando così:

var db = require('redis'); 

db.getData('someData', function(err, result){ 
    console.log(result); // real world code goes here! 
}); 

il sistema modulare nodo si occupa della riposo.

+0

Quindi la mia unica domanda a riguardo è che questo crea una nuova connessione ogni volta? In realtà ho già iniziato a farlo, ma voglio essere sicuro che non lo faccia. – ngreenwood6

+0

Sembra riutilizzare una connessione esistente, se ne ha una. Se le connessioni vengono automaticamente eliminate quando non utilizzate, si riconnetteranno. –

2

Un modo per farlo è aggiungere la connessione come proprietà di un oggetto che sarà disponibile per tutti i moduli che ne hanno bisogno. Per esempio nella mia app espressa ho qualcosa come questo nel mio principale file app:

require('./config/database')(app); 

e il file config/database assomiglia:

var mongoose = require('mongoose'); 

module.exports = function(app) { 
    var database = app.get('env'); 
    var uri = database === 'production' ? 'something...' : 'localhost'; 
    return app.locals.db = mongoose.createConnection(uri, database); 
}; 

Eventuali moduli che necessitano di una connessione db possono poi accedere app.locals.db semplicemente esportando una funzione che accetta come argomento app (come sopra). Ovviamente è necessario modificarlo in qualche modo se si utilizza qualcosa di diverso da espresso, ma l'idea rimane la stessa.

+0

Soluzione molto creativa ma penso che il genere di nuvole sia la gente del posto.Questo è sicuramente qualcosa di utile per passare automaticamente i dati agli utenti locali – ngreenwood6

+0

Penso che questo sia ciò che è app.locals. L'ho portato a un livello estremo nel mio attuale progetto, caricando e assegnando ricorsivamente tutti i principali componenti dell'applicazione alle proprietà di 'app.locals' - ad es. tutti i miei modelli sono in "app.locals.models". Mi piace questo modello per due motivi: primo, i miei moduli funzionano indipendentemente dalla struttura del file, cioè non devo scrivere cose come 'require ('../../ models/user')' dappertutto. In secondo luogo, le mie librerie condivise sono disponibili per le visualizzazioni, ad es. se ho un 'app.locals.lib.urlFor', posso usarlo in una vista come' lib.urlFor'. –

+0

Sì, come ho detto penso che abbia i suoi usi (specialmente per config o utilità) ma il db mi piace essere in grado di richiedere solo. Grazie però per l'input hai fatto un vero punto valido su ciò che richiede – ngreenwood6

1

Si sta utilizzando Express, vedo. Basta fare:

app.set('db', mongoose.createConnection('localhost','test')) 

Poi in qualsiasi costruttore modulo, assicurarsi di passare la variabile app, e si può usare per arrivare app.get('db')db al lavoro.

+0

Grazie per la risposta, ma penso che l'altra soluzione si adatta molto meglio. Quindi i miei moduli possono essere più generici e sembra solo più pulito. – ngreenwood6

Problemi correlati