Pregunta

Quiero ser capaz de alojar múltiples aplicaciones nodejs bajo el mismo dominio, sin necesidad de utilizar subdominios (como google.com/reader en lugar de images.google.com). El problema es que siempre estoy escribiendo la primera parte de la URL, por ejemplo, "/ Lector" in exprés / NodeJS.

¿Cómo puedo configurar una aplicación Express, así que la URL base es something.com/myapp?

Así que en lugar de:

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

que 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 a staticProvider configure de Conectar a comportarse de la misma manera (en este momento el valor predeterminado es servir archivos estáticos a something.com/js o something.com/css en lugar de something.com/myapp/js)

¿Fue útil?

Solución

Por el momento esto no se admite, y no es fácil de añadir por su cuenta.

Todo el material de enrutamiento está enterrado profundamente dentro del código del servidor, y como un bono que no hay exposición de las rutas ellas SELFS.

Me buscó en la fuente y también la inspección de la versión más reciente de Express y el middleware Connect, pero todavía no hay soporte para dicha funcionalidad, debe abrir un tema ya sea en Conectar o expreso propio .

Mientras tanto ...

Patch lo mismo, aquí hay una manera rápida y fácil con una sola línea de código cambiado.

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

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

Esto debe estar alrededor de 357 línea, sustituir eso con:

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

Ahora sólo tiene que añadir el ajuste:

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

Esta bien trabaja con caminos que son cadenas de civil, para el apoyo RegEx que tendrá que cortar alrededor en el middleware enrutador ti mismo, mejor archivo de un problema en ese caso.

Por lo que el proveedor va estática, sólo tiene que añadir en /mypapp cuando su puesta en marcha.

Actualizar

hizo trabajar 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;
    }
}

Sólo probado esto con un puñado de expresiones, por lo que este no es el 100% probado pero en teoría debería funcionar.

Actualización 2

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

Otros consejos

El router expreso 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 expresar 4.0):

El módulo expreso-espacio de nombres (muerto) que se utiliza para 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
        });
});

Sólo para actualizar el hilo, ahora con Express.js v4 usted puede hacerlo sin necesidad de utilizar 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);

Saludos!

yo era capaz de lograr esto mediante una combinación de Express-espacio de nombres para las rutas y una solución de la discusión en grupo por debajo de google para los activos estáticos. Este fragmento será tratar una solicitud a /foo/javascripts/jquery.js como una solicitud para /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 fiabilidad. Si la fiabilidad es importante, una solución común es utilizar un front-end revertir proxy HTTP tal como nginx o HAProxy. Ambos uso en un solo hilo evented arquitectura y son por lo tanto muy escalable.

A continuación, puede tener diferentes procesos de nodos para los diferentes subsitios, y si un sitio falla (excepción no detectada, pérdida de memoria, error del programador, lo que sea) el resto de subsitios seguir trabajando.

Yo estaba buscando esta característica, pero para las rutas de API, no para los archivos estáticos. Lo que hice fue que cuando inicializa el router, he añadido la ruta de montaje. Así que mi aspecto de configuración como esta

//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 de la '/ api' al llamar al router

Sé que esto es una pregunta muy antiguo, pero Express ha cambiado mucho ya que la mayoría de estas respuestas fueron publicadas así que pensé en compartir mi enfoque.

Puede, por supuesto, el uso de routers con Express 4 al grupo funcionalidad relacionada juntos detrás de un camino particular. Esto está bien documentado y ya ha sido cubierto por otras respuestas.

Sin embargo, también es posible montar toda una aplicación en una ruta particular. A modo de ejemplo, asumamos nuestra aplicación (la que queremos anfitrión /myapp) es similar al siguiente, 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 el archivo de nuestros principales js que podría luego montar toda esta solicitud 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 aquí dos aplicaciones, una montada sobre la otra. La principal aplicación podría tener otras sub-aplicaciones montadas en diferentes caminos según sea necesario.

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

Algunos documentación acerca de sub-aplicaciones se puede encontrar aquí:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top