2011-12-15 10 views
30

Ho diverse app che sto cercando di unire in una singola "suite": 2 app sono standalone, una è semplicemente un auth layer (usando everyauth per FB Connect). Voglio impostarlo in questo modo:Come montare le sotto-applicazioni express.js?

  • /- (casa) l'elenco delle applicazioni
  • /auth - il login per qualsiasi applicazione
  • /app1 - richiede l'accesso tramite/autenticazione per accedere
  • /app2 - (stesso)

Ho pensato di lasciare app1 e app2 standalone, con il livello superiore come proxy, ma penso che sarebbe difficile condividere un sistema di autenticazione tra di loro. Gli host virtuali (tramite Connect) potrebbero funzionare, ma non voglio necessariamente un sottodominio DNS per ciascuno. Quindi preferirei che l'app principale fosse il livello auth e gli altri "montassero" in quello, con basepath impostato su ogni app su un percorso secondario. (basepath è menzionato nell'espresso Guide ma non documentato.)

Tutti usano MongoDB, il livello auth usa connect-mongodb per le sessioni, quindi spero che saranno in grado di condividere l'intera autenticazione/sessione strato tra di loro.

in un altro thread, "How to share sessions in mounted express apps", Stephen scrive,

Ho una piuttosto complessa applicazione web basata espresso che è diviso in alcune applicazioni sub che sono anche le applicazioni che utilizzano Express (app.use()) ...

Quindi, come si utilizza app.use() per montare un'app secondaria? Stavo semplicemente cercando di usare var subApp = require('./subapp/app.js'), con listen() in esecuzione solo nella sub-app quando ! module.parent (quindi non come una sub-app) ... ma sembra che carica tutti i percorsi della sub-app direttamente nell'app padre. Ho provato a impostare basepath utilizzando app.set('basepath', '/subapp/'), app.basepath = '/subapp/', ecc., Sia nella stessa app secondaria che dall'app padre, ma non sembra avere alcun effetto.

Le app di montaggio di questo tipo rendono incredibilmente flessibile, ma non è chiaro come farlo ... qualsiasi consiglio sarebbe estremamente gradito !! (E io sono felice di condividere lezioni da mia implementazione everyauth se qualcuno è alle prese con quello.)

+1

Correzione: ho scritto "ma che sembra per caricare tutti i percorsi del sub-app dritto in app genitore", ma infatti i percorsi delle sotto-app non sembrano essere caricati da nessuna parte. Vengono caricati solo i percorsi dell'app principale. Questo è via 'require ('./ sub-app/app.js')'. – thebuckst0p

+0

Un piccolo progresso, forse: se richiedo() 'l'app secondaria in' subApp' e quindi 'use (subApp)', carica i percorsi della sub-app nell'app padre. (Come originariamente descritto.) 'Basepath' non sembra modificare automaticamente alcun percorso. – thebuckst0p

+0

'q = require ('login'); path = 'login'; app.use ('/' + path, x) ', volevo solo sottolineare che darn leading/è importante. – Prospero

risposta

38

app.use(uri, instanceOfExpressServer)

Basta assicurarsi che non si chiama .listen su di esso.

L'alternativa è utilizzare require("cluster") e richiamare tutte le app in un singolo master in modo che condividano la stessa porta. Quindi basta impostare il routing su "solo lavoro"

+0

Grazie! Per 'uri' ho fatto il percorso relativo '/ subapp', e funziona !! – thebuckst0p

+0

'require (" cluster ")' funziona su RestifyJS o funzionerà solo con ExpressJS? – junerockwell

6

Non so se questo ti aiuta ma stavo cercando di prefisso i miei percorsi API. Quello che ho fatto è stato quando ho inizializzato il router, ho aggiunto il percorso di montaggio. Quindi la mia configurazione è simile al seguente

//Default configuration 
app.configure(function(){ 
    app.use(express.compress()); 
    app.use(express.logger('dev')); 
    app.set('json spaces',0); 
    app.use(express.limit('2mb')); 
    app.use(express.bodyParser()); 
    app.use('/api', app.router); 
    app.use(function(err, req, res, callback){ 
     res.json(err.code, {}); 
    }); 
}); 

Avviso del '/ api' quando si chiama il router

+0

È abbastanza intelligente! –