2012-09-05 9 views
7

Mam do czynienia z następującą sytuacją. Aby dalej modulować rozwój mojego oprogramowania, napisałem kilka standardowych modułów samodzielnie. Pomyśl na przykład o module logowania opartym na Expressie i Paszporcie, pozwalającym użytkownikom logować się na różnego rodzaju serwisach społecznościowych. Moduł zawiera również interfejs użytkownika do zarządzania użytkownikami, logowania, rejestracji, profilu itp.Node.js Express: wymagaj/używaj jednej aplikacji w innej

Teraz staram się upuścić folder aplikacji Auth (zawierający aplikację ekspresową, wszystkie trasy, widoki , modele, ustawienia i zależności) do innej aplikacji ekspresowej (na przykład CMS), a następnie załaduj ją na coś podobnego do require('./lib/auth/app.js'). Wiem, że to możliwe, spójrz na Kue.

Jak miałbym to zrobić? A jak mam zarządzać problemami z przestrzenią nazw? Mógłbym dodać do każdej trasy /auth/, ale mogę sobie wyobrazić, że ustawienia (app.use()) i publiczny folder byłyby sprzeczne z ustawieniami "nadrzędnego" app.js i folderem publicznym.

Dzięki z góry,

Fabian

Odpowiedz

6

Chyba znalazłem odpowiedź. Tak więc znalazłem this question i this one. Domyślam się, że moja terminologia była wyłączona.

Rozwiązałem mój problem, wykonując kilka czynności. Po pierwsze, zmieniłem wszystkie trasy i adresy URL na "namespaced" (nie do końca, ale to działa). Wszystkie trasy mają teraz przed sobą /auth/. Zrobiłem to samo dla wszystkich linków, więc to wszystko działa.

Następnie usunąłem część serwera z mojej aplikacji.js. Tak więc, zamiast robić:

require('http').createServer(app).listen(app.get('port'));

po prostu zrobić:

module.exports = app;

I dodam jakieś niestandardowe metody do obiektu aplikacji:

app.isLoggedIn = auth.isLoggedIn; 
app.notLoggedIn = auth.notLoggedIn; 

Następnie w moja aplikacja root, ja po prostu wykonuję następujące czynności, aby załadować aplikację auth. Routing, pliki publiczne i wszystkie inne rzeczy dzieją się magicznie. całkiem fajne.

var auth = require('./vendor/auth/app'); 
var app = express(); 

app.configure(function() { 
    app.use(auth); // use our auth app 

    // do a lot of root-app related stuff... 
}); 

rzeczy nadal robić:

Moja auth aplikacja wykorzystuje pewne sesji rzeczy. Zgodnie z drugim link, jeśli dobrze rozumiem, rzeczy w mojej aplikacji app.use(session...) zostaną przesłonięte przez app.use. Ponadto chcę zdefiniować pomocnika EJS do generowania moich adresów URL (coś takiego jak site_url('/facebook/callback'), który następnie wskazuje na /auth/facebook/callback). Na koniec muszę dodać ustawienia z mojej aplikacji root. Myślę o opakowaniu całego mojego app.js (w auth) w funkcji, do której przekazuję obiekt config. Tak:

module.exports = function(config) { 
    var app = express(); 

    app.set('config', config); 
    // various app settings, routes, etc 

    // return app so it's available in my root. 
    return app; 

} 

Mam nadzieję, że to pomoże, jeśli potrzebujesz trochę więcej informacji Zobaczę, czy mogę pisać jakiś kod na GIST. po prostu daj mi znać!

Powiązane problemy