Est-il possible de définir une URL de base pour l'application NodeJS?
Je veux être en mesure d'héberger plusieurs applications NodeJS sous le même domaine, sans l'utilisation de sous-domaines (comme google.com/reader au lieu de images.google.com). Le problème est que je suis toujours en train de taper la première partie de l'url par exemple "/lecteur" dans l'Express/NodeJS.
Comment puis-je configurer un Express application de sorte 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 également à configurer Connect staticProvider à se comporter de la même manière (à droite maintenant, il est par défaut à servir les fichiers statiques pour something.com/js
ou something.com/css
au lieu de something.com/myapp/js
)
- Peut-être que vous pouvez mettre à jour la réponse, car il est obsolète?
Vous devez vous connecter pour publier un commentaire.
Pour l'instant, ce n'est pas pris en charge, et il n'est pas facile de l'ajouter sur votre propre.
L'ensemble du routage des choses est enterré profondément à l'intérieur du code serveur, et en prime, il n'y a pas d'exposition de la route des selfs.
J'ai creusé par le biais de la source et également vérifié la dernière version de Express et le Connecter middleware, mais il n'y a toujours pas de support pour ce genre de fonctionnalité, vous devez ouvrir une question sur Connecter 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 a changé.
Dans
~/.local/lib/node/.npm/express/1.0.0/package/lib/express/servers.js
, de recherche pour:Cela devrait être autour de la ligne
357
, remplacez la par:Maintenant, il suffit d'ajouter le paramètre:
Cela fonctionne bien avec les chemins qui sont de simples chaînes de caractères, pour les RegEx l'appui, vous devez hack partout dans le routeur middleware vous-même, mieux fichier un problème dans ce cas.
Autant que la statique fournisseur de passe, il suffit d'ajouter dans
/mypapp
lors de la mise en scène.Mise à jour
De le faire fonctionner avec RegExp trop:
J'ai uniquement testé avec une poignée d'expressions, donc ce n'est pas 100% testé mais en théorie ça devrait fonctionner.
Mise à jour 2
Déposé un problème avec le patch:
https://github.com/visionmedia/express/issues/issue/478
L'express routeur 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
Réponse précédente (avant express 4.0) :
L'express-module d'espace de noms (aujourd'hui décédés) utilisé pour faire le tour :
https://github.com/visionmedia/express-namespace
Juste de mettre à jour le fil, maintenant avec
Express.js
v4 vous pouvez le faire sans l'aide deexpress-namespace
:Cheers!
J'ai été en mesure d'atteindre cet objectif en utilisant une combinaison de l'express-l'espace de noms pour les routes et qu'un correctif de la ci-dessous google groupe de discussion pour la statique des actifs. Cet extrait de traiter une demande d' /foo/javascripts/jquery.js comme une demande de /javascripts/jquery.js:
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 courante est d'utiliser un reverse proxy HTTP comme nginx ou HAProxy. Ils utilisent tous les deux le seul thread evented de l'architecture et sont donc très évolutive.
Alors vous pouvez avoir différents nœud de processus pour les différents sous-sites, et si un site n'est pas (exception non interceptée, fuite de mémoire, programmeur d'erreur, peu importe) le reste des sous-sites de continuer à travailler.
Je cherchais cette fonctionnalité, mais pour l'API de routes, pas pour les fichiers statiques. Ce que j'ai fait est que quand j'ai initialisé le routeur, j'ai ajouté le chemin de montage. Donc ma configuration ressemble à ce
Notez le '/api " lors de l'appel du routeur
Error: 'app.router' is deprecated! Please see the 3.x to 4.x migration guide for details on how to update your app.
Je sais que c'est une très vieille question, mais Expriment a beaucoup changé depuis la plupart de ces réponses ont été posté donc j'ai pensé que je devais partager mon approche.
Vous pouvez, bien sûr, utiliser les Routeurs avec Express 4 à regrouper des fonctionnalités derrière un chemin particulier. Cela est bien documenté et a déjà été couvert par d'autres réponses.
Cependant, il est également possible de monter l'intégralité de l'application à un chemin particulier. Comme un exemple, imaginons que l'application (celui que nous voulons pour accueillir au
/myapp
) ressemble à ceci, dans un fichier appelémyapp.js
:Dans notre principal fichier js on pourrait alors monter cette ensemble de l'application au chemin
/myapp
:Noter que nous avons créé deux applications, l'une montée sur l'autre. La principale application pourrait avoir d'autres sous-apps montées à différents chemins que nécessaire.
Le code dans
myapp.js
est complètement indépendant de l'endroit où il a été monté. Il est semblable à la structure utilisée par leexpress-generator
à cet égard.De la documentation sur la sous-apps peuvent être trouvés ici:
https://expressjs.com/en/4x/api.html#app.mountpath
https://expressjs.com/en/4x/api.html#app.onmount