2011-12-15 35 views
30

Tengo varias aplicaciones que intento fusionar en una única "suite": 2 aplicaciones son independientes, una es simplemente una capa de autenticación (que utiliza everyauth para FB Connect). Quiero configurarlo de esta manera:Cómo montar sub-aplicaciones express.js?

  • /- (casa) lista de las aplicaciones
  • /auth - iniciar sesión para cualquier aplicación
  • /app1 - requiere inicio de sesión a través de/autenticación para acceder a
  • /app2 - (mismo)

He considerado dejar app1 y app2 independientes, con la capa superior como proxy, pero creo que sería difícil compartir un sistema de autenticación entre ellos. Virtualhosts (a través de Connect) podría funcionar, pero no necesariamente quiero un subdominio DNS para cada uno. Así que, en cambio, me gustaría que la aplicación principal sea la capa de autenticación, y las demás "montadas" en esa, con basepath establecido en cada aplicación en una subruta. (basepath se menciona en el expreso Guide pero no está bien documentado)

Todos usan MongoDB, la capa de autenticación usa connect-mongodb para las sesiones, así que espero que puedan compartir toda la autenticación/sesión capa entre ellos.

En otro hilo, "How to share sessions in mounted express apps", Stephen escribe,

que tienen una aplicación web basada expresa bastante complejo que se divide en un par de aplicaciones que son sub también aplicaciones expresas (utilizando app.use()) ...

Entonces, ¿cómo se usa app.use() para montar una sub-aplicación? Simplemente estaba tratando de usar var subApp = require('./subapp/app.js'), con listen() ejecutándose solo en la subaplicación cuando ! module.parent (no como una subaplicación) ... pero parece que carga todas las rutas de la sub-aplicación directamente en la aplicación principal. He intentado configurar basepath usando app.set('basepath', '/subapp/'), app.basepath = '/subapp/', etc., tanto en la subaplicación como en la aplicación principal, pero no parece tener ningún efecto.

El montaje de aplicaciones como esta hace que expresar sea increíblemente flexible, pero no está claro cómo hacerlo ... ¡cualquier consejo sería muy bienvenido! (Y estoy feliz de compartir las enseñanzas de mi aplicación everyauth si alguien está luchando con eso.)

+1

Corrección: Escribí "pero que parece cargar todos los caminos de la sub-aplicación directamente en la aplicación de los padres", pero de hecho, las rutas de la sub-aplicación no parecen estar cargando en ningún lado. Solo se cargan las rutas de la aplicación principal. Esto es a través de 'require ('./ sub-app/app.js')'. – thebuckst0p

+0

Un poco de progreso, tal vez: si 'requiero()' la sub-aplicación en 'subApp' y luego' use (subApp) ', carga las rutas de la sub-aplicación en la aplicación principal. (Como se describió originalmente). 'Basepath' no parece modificar ninguna ruta de forma automática. – thebuckst0p

+0

'q = require ('login'); path = 'login'; app.use ('/' + path, x) ', solo quería señalar que darn leading/es importante. – Prospero

Respuesta

38

app.use(uri, instanceOfExpressServer)

Sólo asegúrese de que usted no llama .listen en él.

La alternativa es usar require("cluster") e invocar todas sus aplicaciones en un solo maestro para que compartan el mismo puerto. A continuación, simplemente obtenga la ruta para "simplemente funcione"

+0

¡Gracias! Para 'uri' hice la ruta relativa '/ subapp', y funciona !! – thebuckst0p

+0

¿'require (" cluster ")' funciona en RestifyJS o solo funcionará para ExpressJS? – junerockwell

6

No estoy seguro si esto lo ayuda pero estaba buscando prefijar mis rutas API. Lo que hice fue que cuando inicié el enrutador, agregué la ruta de montaje. Así que mi configuración se parece a esto

//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, {}); 
    }); 
}); 

Aviso del '/ api' al llamar al router

+0

¡Eso es muy inteligente! –

Cuestiones relacionadas