2012-10-26 8 views
6

Szukam jakiegoś kierunku od niektórych doświadczonych programistów node.js. Największym problemem, jaki napotykam, jest przekazywanie zmiennych do oddzielnych modułów. Na przykład w moim server.js mam następujące:node.js zmienne przechodzące

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

Teraz nie używam moich tras wewnątrz pliku server.js one są podzielone tam własnych plików. Tak dla przykładu blog może być tak:

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

Teraz to jest, gdy problem jest w nie chcę mieć do konfiguracji połączenia z bazą danych w każdej z moich dróg i nie wspomnieć, że myślę. że da to mnóstwo połączeń. Jak sobie z tym poradzić, czy jest tam przykładowa aplikacja "REAL WORLD", ponieważ nie mogę znaleźć niczego na ten temat i wiem, że ludzie musieli wcześniej mieć ten problem. Wiem, że węzeł buforuje moduły, ale nie mogę sobie wyobrazić, że buforowałoby połączenie, biorąc pod uwagę, że było ono w jego własnym module. Stworzyłem moduł konfiguracyjny, który przechowuje konfigurację strony, więc wymaganie tego tam, gdzie jest mi potrzebne, nie stanowi problemu. Wyobrażam sobie, że są inne rzeczy, z którymi chciałbym to zrobić, więc najlepiej byłoby to teraz zrozumieć.

Każda pomoc jest doceniana.

Odpowiedz

3

Oto, co robię w mojej aplikacji na świecie rzeczywistym.

Mam moduł o nazwie redis (to baza danych używam). Zawiera następujący kod:

var store; 

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

Dzięki temu mogę uzyskać bezpośredni dostęp do klienta, jeśli zajdzie taka potrzeba. Prawie nigdy tego nie robię. Ten sam moduł zawiera kod tak:

exports.getData = function(dataID, callback){ 

    var key = DATA_STORE_PREFIX; 

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

Używam tego przez włączenie modułu w jednej lub więcej modułów trasy redis i nazywając go tak:

var db = require('redis'); 

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

System moduł węzeł dba o odpoczynek.

+0

Więc moje jedyne pytanie o to, czy to tworzy nowe połączenie za każdym razem? Właściwie to zacząłem już to robić, ale chcę mieć pewność, że tak się nie stanie. – ngreenwood6

+0

Wygląda na to, że ponownie wykorzystuje istniejące połączenie, jeśli je posiada. Jeśli połączenia zostaną automatycznie odrzucone, gdy nie będą używane, połączenie zostanie ponownie nawiązane. –

2

Jednym ze sposobów jest dodanie połączenia jako właściwości obiektu, który będzie dostępny dla wszystkich modułów, które go potrzebują. Na przykład w mojej wyraźnej aplikacji mam coś takiego w moim głównym pliku aplikacji:

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

a plik config/database wygląda następująco:

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); 
}; 

wszystkie moduły, które wymagają połączenia db może następnie uzyskać dostęp app.locals.db prostu eksportując funkcję, która przyjmuje app jako argument (tak jak powyżej). Oczywiście będziesz musiał to nieco zmodyfikować, jeśli używasz czegoś innego niż ekspresowe, ale idea pozostaje taka sama.

+0

Bardzo kreatywne rozwiązanie, ale myślę, że to rodzaj chmury mieszkańców.Jest to z pewnością coś użytecznego do automatycznego przekazywania danych do lokalnych użytkowników. – ngreenwood6

+0

Myślę, że właśnie o to chodzi w 'app.locals'. Wziąłem to do ekstremum w moim obecnym projekcie przez rekurencyjne automatyczne ładowanie i przypisywanie wszystkich głównych składników aplikacji do właściwości 'app.locals' - np. wszystkie moje modele są w 'app.locals.models'. Podoba mi się ten wzorzec z dwóch powodów: po pierwsze, moje moduły działają niezależnie od struktury plików, tj. Nie muszę pisać w różnych miejscach jak 'require (" ../../ models/user ') ". Po drugie, moje udostępnione biblioteki są dostępne dla widoków - np. jeśli mam 'app.locals.lib.urlFor', mogę go użyć w widoku jako' lib.urlFor'. –

+0

Tak, jak powiedziałem, myślę, że ma swoje zastosowania (szczególnie dla konfiguracji lub narzędzi), ale db lubię być w stanie wymagać. Dzięki, że dla wprowadzenia u zrobiłeś prawdziwy ważny punkt o wymaganiach – ngreenwood6

1

Używasz ekspresu, widzę. Wystarczy zrobić:

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

Następnie w każdym konstruktora modułu, należy przekazać zmienną app, i można użyć app.get('db') dostać db do pracy.

+0

Dzięki za odpowiedź, ale myślę, że inne rozwiązanie pasuje znacznie lepiej. Wtedy moje moduły mogą być bardziej ogólne i po prostu wydaje się czystsze. – ngreenwood6

Powiązane problemy