2012-01-19 7 views
12

simplemente empecé a usar una nueva versión de Express (2.5.5) que, por defecto crea un directorio ./routes junto con ./views y ./publicCómo acceder a las variables declaradas en la aplicación principal.js en archivos de ruta separados en node.js Express 2.5.5?

Dentro de las rutas hay un archivo que contiene index.js:

/* 
* GET home page. 
*/ 

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

por defecto (después de ejecutar express desde la línea de comandos) y esta es la sección de rutas en el principal app.js:

// Routes 

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

He configurado una variable para un cliente Redis en el principal app.js:

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

y me preguntaba cómo podía acceder a los métodos de db (y cualesquiera otros módulos de E require en app.js) en los archivos contenidos en ./routes

+0

Pongo No sé si esta es una buena práctica, pero podría tener sus módulos envueltos dentro de una función 'exports.init' que toma las instancias compartidas como argumentos. Esa función devolvería las funciones de exportación reales, y necesita el archivo como 'var routes = require (" ./ routes/"). Init (db);'. – pimvdb

Respuesta

21

Me gustó mucho la solución de Jamund, pero me gustaría extender el concepto a esto:

// 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(); 

tanto db en el índice y otro archivo obtendría la misma instancia del cliente Redis

+0

¿Tendrá entonces que exportar cada función redis que quiera usar? ejemplo: redis.set ("alguna clave", "algún valor"); o redis.get ("missingkey", función (err, respuesta) { // la respuesta es nula cuando falta la clave console.log (respuesta); }); etc. – asiammyself

+0

@asiammyself ¿a qué te refieres con exportación? usted podría llamar 'db.set (key, val)' o 'db.get (key, fn)' de sus otros archivos. –

+0

como tal: module.exports {get: redis.get() set: redis.set} pero dejaste claro que funcionarían, así que no te preocupes. – asiammyself

5

Simplemente llame a esto en la parte superior de sus archivos. Requiere estar en un espacio compartido, por lo que puede volver a requerir el archivo varias veces y siempre hará referencia a la misma versión. Si quiere ser de lujo puede crear su propio módulo DB que hace algo como esto, para evitar la doble clientes 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() desconecta limpiamente al cliente https://github.com/mranney/node_redis#clientend :) – jbmusso

3

puede crear una aplicación global y colgar los VARs que desea compartir fuera eso o puede usar una función de inicialización en el archivo de rutas

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');}); 
} 
Cuestiones relacionadas