2012-09-05 9 views
7

Me enfrenta a la siguiente situación. Con el fin de modular aún más mi desarrollo de software, he escrito algunos módulos estándar independientes. Piénsese, por ejemplo, en un módulo de inicio de sesión basado en Express y Passport, que permite a los usuarios iniciar sesión con todo tipo de servicios sociales. El módulo también contiene UI para la administración de usuarios, inicio de sesión, registro, perfil, etc.Node.js Express: requiere/usa una aplicación dentro de otra

Ahora, lo que intento hacer es simplemente soltar la carpeta de la aplicación Auth (que contiene la aplicación express, todas sus rutas, vistas , modelos, configuraciones y dependencias) en otra aplicación Express (por ejemplo, un CMS) y luego cárguela con algo como require('./lib/auth/app.js'). Sé que esto es posible, eche un vistazo al Kue.

¿Cómo voy a hacer esto? ¿Y cómo administro los problemas de espacio de nombres? Podría agregar /auth/ a cada ruta, pero me imagino que la configuración (app.use()) y la carpeta pública entrarían en conflicto con la configuración y la carpeta pública 'parent' app.js '.

Gracias de antemano,

Fabian

Respuesta

6

que he encontrado mi respuesta. Entonces, encontré this question y this one. Supongo que mi terminología estaba apagada.

He resuelto mi problema haciendo algunas cosas. En primer lugar, cambié todas las rutas y direcciones URL para que sean "espacios de nombre" (no realmente, pero esto hace el trabajo). Todas las rutas ahora tienen /auth/ delante de ellas. Hice lo mismo con todos los enlaces, así que todo está funcionando.

A continuación, eliminé la parte del servidor de mi app.js. Así, en lugar de hacerlo:

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

acabo de hacer:

module.exports = app;

Y añado algunos métodos personalizados en el objeto de aplicación:

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

Luego, en mi aplicación raíz, solo hago lo siguiente para cargar la aplicación auth. El enrutamiento, los archivos públicos y todo lo demás sucede mágicamente. muy genial.

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

cosas por hacer todavía:

Mi auth aplicación utiliza algunas cosas sesión. De acuerdo con el segundo link, si entiendo correctamente, las cosas app.use(session...) en mi aplicación auth quedan anuladas por app.use. Además, quiero definir un auxiliar EJS para generar mis direcciones URL (algo así como site_url('/facebook/callback') que apunta a /auth/facebook/callback). Finalmente, necesito incluir configuraciones desde mi aplicación raíz. Estoy pensando en envolver mi entero app.js (en auth) en una función, a la que paso un objeto de configuración. De esta manera:

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; 

} 

espero que esto ayude, si usted necesita un poco más de información Voy a ver si puedo publicar algo de código para una esencia. ¡sólo házmelo saber!

Cuestiones relacionadas