2012-01-19 9 views
12

Właśnie zaczął używać nowej wersji (2.5.5) Express, które domyślnie tworzy katalog ./routes wraz z ./views i ./publicJak uzyskać dostęp do zmiennych zadeklarowanych w głównym app.js w osobnych plikach trasy w pliku node.js Express 2.5.5?

Wewnątrz tras znajduje się plik index.js który zawiera:

/* 
* GET home page. 
*/ 

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

domyślnie (po uruchomieniu express z linii poleceń) i jest to odcinek trasy w głównej app.js:

// Routes 

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

mam ustawić zmienną dla klienta Redis w głównym app.js:

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

i zastanawiałem się, w jaki sposób mogę uzyskać dostęp do metod db (i wszelkie inne moduły I require w app.js) zawartych w plikach w ./routes

+0

I don Nie wiadomo, czy jest to dobra praktyka, ale możesz również umieścić swoje moduły w funkcji 'exports.init', która przyjmuje współdzielone instancje jako argumenty. Ta funkcja zwróciłaby rzeczywiste funkcje eksportu i potrzebujesz pliku takiego jak 'var routes = require (" ./ routes/"). Init (db);'. – pimvdb

Odpowiedz

21

bardzo lubiłem rozwiązanie Jamund, ale chciałbym rozszerzyć pojęcie to:

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

zarówno db na indeksie i inne pliki dostanie taką samą instancję klienta Redis

+0

Czy musiałbyś eksportować każdą funkcję redisu, której chcesz użyć? przykład: redis.set ("some key", "some val"); lub redis.get ("missingkey", funkcja (err, reply) { // odpowiedź jest pusta, gdy brakuje klucza console.log (reply); }); itp. – asiammyself

+0

@asiammy co masz na myśli przez eksport? byłbyś w stanie wywołać 'db.set (key, val)' lub 'db.get (key, fn)' ze swoich innych plików. –

+0

podobnie jak w przypadku: module.exports {get: redis.get() set: redis.set}, ale dałeś jasno do zrozumienia, że ​​zadziałają, więc nie martw się. – asiammyself

5

Po prostu wywołaj to na górze swoich plików. Wymaga to współdzielenia przestrzeni, więc możesz wielokrotnie wymagać tego pliku i zawsze będzie on odnosił się do tej samej wersji. Jeśli chcesz być wyobraźnia można stworzyć swój własny moduł db, że ma coś takiego, aby zapobiec podwójne tworzenie Klienci:

// 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() czysto rozłącza klienta https://github.com/mranney/node_redis#clientend :) – jbmusso

3

można utworzyć aplikację globalny i powiesić vars chcesz podzielić się, że albo możesz użyć funkcji inicjalizującej w pliku tras

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');}); 
} 
Powiązane problemy