¿Es posible establecer una URL base para la aplicación NodeJS?

Deseo poder alojar varias aplicaciones NodeJS bajo el mismo dominio, sin utilizar subdominios (como google.com/reader en lugar de images.google.com). El problema es que siempre escribo la primera parte de la URL, por ejemplo, “/ reader” en Express / NodeJS.

¿Cómo puedo configurar una aplicación Express para que la URL base sea something.com/myapp ?

Entonces, en lugar de:

 app.get("/myapp", function (req, res) { // can be accessed from something.com/myapp }); 

Puedo hacer:

 // Some set-up app.base = "/myapp" app.get("/", function (req, res) { // can still be accessed from something.com/myapp }); 

También me gustaría configurar el staticProvider de Connect para que se comporte de la misma manera (ahora, de forma predeterminada, sirve archivos estáticos en something.com/js o something.com/css lugar de something.com/myapp/js )

Por el momento, esto no es compatible, y no es fácil agregarlo por su cuenta.

Todo el material de enrutamiento está enterrado en el interior del código del servidor, y como beneficio adicional, no hay exposición de las rutas propias.

Busqué en la fuente y también revisé la última versión de Express y el middleware de Connect, pero todavía no hay soporte para dicha funcionalidad, debe abrir un problema ya sea en Connect o Express .

Mientras tanto…

Parchee la cosa usted mismo, aquí hay una forma rápida y fácil de cambiar solo una línea de código.

En ~/.local/lib/node/.npm/express/1.0.0/package/lib/express/servers.js , busque:

 // Generate the route this.routes[method](path, fn); 

Esto debería estar alrededor de la línea 357 , reemplázalo con:

 // Generate the route this.routes[method](((self.settings.base || '') + path), fn); 

Ahora solo agrega la configuración:

 app.set('base', '/myapp'); 

Esto funciona bien con rutas que son cadenas simples, para compatibilidad con RegEx usted tendrá que hackear el middleware del enrutador, mejor archivar un problema en ese caso.

En cuanto al proveedor estático, simplemente agregue /mypapp al configurarlo.

Actualizar

Lo hizo funcionar con RegExp también:

 // replace this.routes[method](baseRoute(self.settings.base || '', path), fn); // helper function baseRoute(base, path) { if (path instanceof RegExp) { var exp = RegExp(path).toString().slice(1, -1); return new RegExp(exp[0] === '^' ? '^' + base + exp.substring(1) : base + exp); } else { return (base || '') + path; } } 

Solo probé esto con un puñado de expresiones, por lo que no se lo probó al 100%, pero en teoría debería funcionar.

Actualización 2

Archivado un problema con el parche:
https://github.com/visionmedia/express/issues/issue/478

El enrutador express puede manejar esto desde 4.0

http://expressjs.com/en/api.html#router

http://bulkan-evcimen.com/using_express_router_instead_of_express_namespace.html

 var express = require('express'); var app = express(); var router = express.Router(); // simple logger for this router's requests // all requests to this router will first hit this middleware router.use(function(req, res, next) { console.log('%s %s %s', req.method, req.url, req.path); next(); }); // this will only be invoked if the path ends in /bar router.use('/bar', function(req, res, next) { // ... maybe some additional /bar logging ... next(); }); // always invoked router.use(function(req, res, next) { res.send('Hello World'); }); app.use('/foo', router); app.listen(3000); 

Respuesta anterior (antes de expreso 4.0):

El módulo de espacio de nombres expresos (muerto ahora) solía hacer el truco:

https://github.com/visionmedia/express-namespace

 require('express-namespace'); app.namespace('/myapp', function() { app.get('/', function (req, res) { // can be accessed from something.com/myapp }); }); 

Solo para actualizar el hilo, ahora con Express.js v4 puedes hacerlo sin usar express-namespace :

 var express = require('express'), forumRouter = express.Router(), threadRouter = express.Router(), app = express(); forumRouter.get('/:id)', function(req, res){ res.send('GET forum ' + req.params.id); }); forumRouter.get('/:id/edit', function(req, res){ res.send('GET forum ' + req.params.id + ' edit page'); }); forumRouter.delete('/:id', function(req, res){ res.send('DELETE forum ' + req.params.id); }); app.use('/forum', forumRouter); threadRouter.get('/:id/thread/:tid', function(req, res){ res.send('GET forum ' + req.params.id + ' thread ' + req.params.tid); }); forumRouter.use('/', threadRouter); app.listen(app.get("port") || 3000); 

¡Aclamaciones!

Pude lograr esto usando una combinación de espacio de nombres expresos para las rutas y una solución de la discusión de grupo de google a continuación para los activos estáticos. Este fragmento tratará una solicitud a /foo/javascripts/jquery.js como una solicitud a /javascripts/jquery.js:

 app.use('/foo', express.static(__dirname + '/public')); 

Fuente: https://groups.google.com/forum/#!msg/express-js/xlP6_DX6he0/6OTY4hwfV-0J

También hay problemas de confiabilidad. Si la confiabilidad es importante, una solución común es usar un proxy HTTP inverso de front-end como nginx o HAProxy. Ambos usan una architecture de un solo hilo y por lo tanto son muy escalables.

Luego puede tener diferentes procesos de nodo para diferentes subsitios, y si un sitio falla (excepción no detectada, fuga de memoria, error del progtwigdor, lo que sea), el rest de los subsitios seguirán funcionando.

Estaba buscando esta característica, pero para las rutas API, no para los archivos estáticos. Lo que hice fue que cuando inicié el enrutador, agregué la ruta de assembly. Entonces mi configuración se ve así

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

Observe el '/ api' al llamar al enrutador

Sé que esta es una pregunta muy antigua, pero Express ha cambiado mucho desde que se publicaron la mayoría de estas respuestas, así que pensé en compartir mi enfoque.

Por supuesto, puede usar enrutadores con Express 4 para agrupar la funcionalidad relacionada detrás de una ruta en particular. Esto está bien documentado y ya ha sido cubierto por otras respuestas.

Sin embargo, también es posible montar una aplicación completa en una ruta particular. Como ejemplo, supongamos que nuestra aplicación (la que queremos alojar en /myapp ) se ve así, en un archivo llamado myapp.js :

 var express = require('express'), path = require('path'), app = express(); app.use(express.static(path.join(__dirname, 'public'))); app.get('/hello', function(req, res) { res.send('Hello'); }); // Lots of other stuff here exports.app = app; 

En nuestro archivo js principal, podríamos montar toda esta aplicación en la ruta /myapp :

 var express = require('express'), app = express(), myApp = require('./myapp').app; app.use('/myapp', myApp); app.listen(3000); 

Tenga en cuenta que hemos creado dos aplicaciones aquí, una montada en el otro. La aplicación principal podría tener otras subaplicaciones montadas en diferentes rutas según sea necesario.

El código en myapp.js es completamente independiente de donde fue montado. Es similar a la estructura utilizada por el express-generator en ese sentido.

Parte de la documentación sobre sub-aplicaciones se puede encontrar aquí:

https://expressjs.com/en/4x/api.html#app.mountpath https://expressjs.com/en/4x/api.html#app.onmount

    Intereting Posts