Question

Je veux être en mesure d'héberger plusieurs applications de NodeJS sous le même domaine, sans utiliser des sous-domaines (comme google.com/reader au lieu de images.google.com). Le problème est que je tape toujours la première partie de l'URL par exemple "/ Lecteur" express / NodeJS.

Comment puis-je mettre en place une application express afin que l'URL de base est something.com/myapp?

Ainsi, au lieu de:

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

Je peux le faire:

// Some set-up
app.base = "/myapp"

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

Je tiens aussi à configurer Connect staticProvider de se comporter de la même manière (en ce moment il est par défaut à servir des fichiers statiques à something.com/js ou something.com/css au lieu de something.com/myapp/js)

Était-ce utile?

La solution

À l'heure actuelle ce n'est pas pris en charge, et ce n'est pas facile d'ajouter sur votre propre.

L'ensemble des choses de routage est enfoui au plus profond dans le code du serveur, et en prime il n'y a pas d'exposition des routes les selfs.

Je creusé à travers la source et aussi vérifié la dernière version de Express et le middleware Connect, mais il n'y a toujours pas de support pour cette fonctionnalité, vous devez ouvrir un problème soit sur Connect ou express lui-même .

Pendant ce temps ...

Patch la chose vous-même, voici un moyen rapide et facile avec une seule ligne de code changé.

Dans ~/.local/lib/node/.npm/express/1.0.0/package/lib/express/servers.js, rechercher:

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

Ce devrait être autour 357 ligne, remplacer par:

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

Maintenant, il suffit d'ajouter le paramètre:

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

Cela fonctionne bien avec des chemins qui sont des chaînes simples, pour le soutien RegEx vous devrez pirater autour du middleware vous routeur, mieux fichier un problème dans ce cas.

En ce qui concerne le fournisseur de statique va, il suffit d'ajouter dans /mypapp lors de la mise en place.

Mise à jour

Fait fonctionner avec RegExp aussi:

// 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;
    }
}

Je ne testé cela avec une poignée d'expressions, de sorte que ce n'est pas 100% testé, mais en théorie, il devrait fonctionner.

Mise à jour 2

Filed un problème avec le patch:
https://github.com/visionmedia/express/issues/issue/478

Autres conseils

Le routeur Express peut gérer cela depuis 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);

Réponse précédente (avant Express 4.0):

Le module express espace de noms (mort maintenant) utilisé pour faire l'affaire:

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

Il suffit de mettre à jour le fil, maintenant avec Express.js v4 vous pouvez le faire sans utiliser 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);

Vive!

J'ai pu y parvenir en utilisant une combinaison d'express espace de noms pour les routes et une solution de la discussion de groupe Google ci-dessous pour les actifs statiques. Cet extrait traitera une demande de /foo/javascripts/jquery.js comme une demande de /javascripts/jquery.js:

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

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

Il y a aussi des problèmes de fiabilité. Si la fiabilité est importante, une solution commune est d'utiliser un inverse frontal proxy HTTP tels que nginx ou HAProxy. Elles utilisent l'architecture evented monothread et sont donc très évolutive.

Ensuite, vous pouvez avoir des processus de nœud pour les différents sous-sites, et si un site ne (exception non détectée, fuite de mémoire, erreur de programmation, quelle que soit) le reste du sous-sites continuer à travailler.

Je cherchais cette fonctionnalité, mais pour les routes de l'API, et non pas pour les fichiers statiques. Ce que je faisais était que quand j'initialisés le routeur, j'ai ajouté le chemin de montage. Donc, mes regards de configuration comme celle-ci

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

Notez que le '/ api' lorsque vous appelez le routeur

Je sais que c'est une question très ancienne, mais Express a beaucoup changé depuis la plupart de ces réponses ont été publiées alors je pensais que je partage mon approche.

Vous pouvez, bien sûr, utiliser les routeurs avec Express 4 pour regrouper les fonctionnalités associées derrière un chemin particulier. Ceci est bien documenté et a déjà été couvert par d'autres réponses.

Cependant, il est également possible de monter une application entière à un chemin particulier. À titre d'exemple, supposons que notre application (celle que nous voulons hôte à /myapp) se présente comme suit, dans un fichier appelé 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;

Dans notre fichier principal js nous pourrions alors monter cette application tout sur le chemin /myapp:

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

app.use('/myapp', myApp);

app.listen(3000);

Notez que nous avons créé deux applications ici, l'un monté sur l'autre. La principale application pourrait avoir d'autres sous-applications montées sur des chemins différents selon les besoins.

Le code myapp.js est complètement indépendant de l'endroit où il a été monté. Il est similaire à la structure utilisée par le express-generator à cet égard.

Vous trouverez de la documentation sur les sous-apps ici:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top