2012-01-19 20 views
12

Ho appena iniziato a utilizzare una nuova versione di Express (2.5.5) che di default crea una directory ./routes con ./views e ./publicCome accedere alle variabili dichiarate nell'app.js principale in file di percorso separati in node.js Express 2.5.5?

All'interno di percorsi v'è un file che contiene index.js:

/* 
* GET home page. 
*/ 

exports.index = function(req, res){ 
    res.render('index', { title: 'Express' }) 
}; 

per default (dopo l'esecuzione express dal comando) e questa è la sezione rotte nella principale app.js:

// Routes 

app.get('/', routes.index); 

ho impostato una variabile per un cliente Redis nella principale app.js:

var redis = require('redis'), 
    db = redis.createClient(); 

e mi chiedevo come avrei potuto accedere ai metodi di db (e qualsiasi altri moduli di I require in app.js) nei file contenuti in ./routes

+0

I don Non so se questa è una buona pratica, ma potresti avere i moduli avvolti in una funzione 'exports.init' che prende le istanze condivise come argomenti. Quella funzione restituirebbe le funzioni di esportazione effettive e richiederai il file come 'var routes = require (" ./ routes/"). Init (db);'. – pimvdb

risposta

21

Mi è piaciuto molto la soluzione di Jamund, ma vorrei estendere il concetto a questo:

// db.js 
var redis = require('redis'); 
module.exports = redis.createClient(); 

// index.js 
var db = require(.'/db') 

// whatever other file 
var db = require(.'/db') 
// do something with db 
db.disconnect(); 

sia db su indice e altro file otterrebbe la stessa istanza del client Redis

+0

Dovresti quindi esportare tutte le funzioni di redis che vuoi utilizzare? esempio: redis.set ("some key", "some val"); o redis.get ("missingkey", function (err, reply) { // la risposta è nullo quando manca la chiave console.log (risposta); }); ecc. – asiammyself

+0

@asiammyself cosa intendi per esportazione? saresti in grado di chiamare 'db.set (key, val)' o 'db.get (key, fn)' dagli altri tuoi file. –

+0

così: module.exports {get: redis.get() set: redis.set} ma hai messo in chiaro che avrebbero funzionato così senza preoccupazioni. – asiammyself

5

Basta chiamare questo nella parte superiore dei file. Richiede sono in uno spazio condiviso, quindi è possibile ri-richiedere il file più volte e farà sempre riferimento alla stessa versione. Se si vuole essere di fantasia è possibile creare il proprio modulo db che fa qualcosa di simile, per evitare doppie clienti creando:

// db.js 
var db 
var redis = require('redis') 
exports.connect = function() { 
    if (!db) db = redis.createClient() 
    return db 
} 

exports.disconnect = function() { 
    redis.quit() 
    db = null 
} 


// index.js 
var dbHelper = require(.'/db') 
var db = dbHelper.connect() 

// whatever other file 
var dbHelper = require(.'/db') 
var db = dbHelper.connect() // won't connect twice 
+0

redis.quit() disconnette in modo pulito il client https://github.com/mranney/node_redis#clientend :) – jbmusso

3

è possibile creare un app globale e appendere i vars che si desidera condividere off che o è possibile utilizzare una funzione di inizializzazione nel file di percorsi

fe

// app.js 

var app = express.createServer() 
    , db = require('redis').createClient(); 

require('./routes').with(app, db); 

// routes.js 
module.exports.with = function(app, db) { 
    app.get('/',function(r,s) { s.end('Sweet');}); 
} 
Problemi correlati