Avant de poser des questions, app.router
je pense que je devrais expliquer au moins ce qui se passe lorsque je travaille avec un middleware. Pour utiliser le middleware, la fonction à utiliser est app.use()
. Lorsque le middleware est en cours d'exécution, il appellera le prochain middleware à l'aide de next()
ou fera en sorte qu'aucun middleware ne soit appelé. Cela signifie que l'ordre dans lequel je passe mes appels de middleware est important, car certains middleware dépendent d'autres middleware, et certains middleware proches de la fin peuvent même ne pas être appelés.
Aujourd'hui, je travaillais sur mon application et mon serveur fonctionnait en arrière-plan. Je voulais faire quelques changements et rafraîchir ma page et voir les changements immédiatement. Plus précisément, je modifiais ma disposition. Je n'ai pas réussi à le faire fonctionner, j'ai donc cherché dans Stack Overflow la réponse et trouvé cette question . Il dit de s'assurer que express.static()
c'est en dessous require('stylus')
. Mais quand j'ai regardé le code de ce PO, j'ai vu qu'il avait son app.router
appel à la toute fin de ses appels de middleware, et j'ai essayé de comprendre pourquoi.
Quand je fait ma demande express.js (version 3.0.0rc4), je la commande express app --sessions --css stylus
et dans mon fichier app.js le code venu configuration avec mon app.router
ci - dessus à la fois le express.static()
et les require('stylus')
appels. Il semble donc que, s'il est déjà configuré de cette façon, il devrait le rester.
Après avoir réorganisé mon code afin que je puisse voir mes modifications de stylet, il ressemble à ceci:
app.configure(function(){
//app.set() calls
//app.use() calls
//...
app.use(app.router);
app.use(require('stylus').middleware(__dirname + '/public'));
app.use(express.static(__dirname + '/public', {maxAge: 31557600000}));
});
app.get('/', routes.index);
app.get('/test', function(req, res){
res.send('Test');
});
J'ai donc décidé que la première étape serait de découvrir pourquoi il est important d'avoir même app.router
dans mon code. J'ai donc commenté, lancé mon application et accédé à /
. Il a très bien affiché ma page d'index. Hmm, cela a peut-être fonctionné parce que j'exportais le routage à partir de mon fichier de routes (routes.index). J'ai ensuite navigué vers /test
et il a affiché Test sur l'écran. Haha, OK, je ne sais pas ce que app.router
ça fait. Qu'il soit inclus dans mon code ou non, mon routage est correct. Il me manque donc quelque chose.
Voici donc ma question:
Quelqu'un pourrait-il expliquer ce qu'il app.router
fait, son importance et où je devrais le placer dans mes appels middleware? Ce serait également bien si j'obtenais une brève explication express.static()
. Autant que je sache, il express.static()
s'agit d'un cache de mes informations, et si l'application ne trouve pas la page demandée, elle vérifiera le cache pour voir si elle existe.
Réponses:
Remarque: cela décrit le fonctionnement d'Express dans les versions 2 et 3. Voir la fin de ce post pour plus d'informations sur Express 4.
static
sert simplement des fichiers ( ressources statiques ) à partir du disque. Vous lui donnez un chemin (parfois appelé point de montage) et il sert les fichiers de ce dossier.Par exemple,
express.static('/var/www')
servirait les fichiers dans ce dossier. Une requête à votre serveur Nodehttp://server/file.html
pourrait donc être utilisée/var/www/file.html
.router
est le code qui exécute vos itinéraires. Lorsque vous le faitesapp.get('/user', function(req, res) { ... });
, c'est lerouter
qui appelle réellement la fonction de rappel pour traiter la demande.L'ordre dans lequel vous passez les éléments
app.use
détermine l'ordre dans lequel chaque middleware a la possibilité de traiter une demande. Par exemple, si vous avez un fichier appelétest.html
dans votre dossier statique et un itinéraire:Lequel est envoyé à un client qui le demande
http://server/test.html
? Quel que soit le middleware attribué enuse
premier.Si tu fais ça:
Ensuite, le fichier sur le disque est servi.
Si vous le faites dans l'autre sens,
Ensuite, le gestionnaire d'itinéraire reçoit la demande et "Bonjour du gestionnaire d'itinéraire" est envoyé au navigateur.
Habituellement, vous souhaitez placer le routeur au - dessus du middleware statique afin qu'un fichier nommé accidentellement ne puisse pas remplacer l'un de vos itinéraires.
Notez que si vous ne le faites pas explicitement
use
larouter
, il est implicitement ajouté par exprès au point que vous définissez un itinéraire ( ce qui explique pourquoi vos itinéraires toujours travaillé , même si vous en commentairesapp.use(app.router)
).Un intervenant a soulevé un autre point à propos de l'ordre de
static
etrouter
que je n'avais pas abordé: l'impact sur les performances globales de votre application.Une autre raison
use
router
cistatic
- dessus est d'optimiser les performances. Si vous mettez enstatic
premier, vous frapperez le disque dur à chaque demande pour voir si un fichier existe ou non. Dans un test rapide , j'ai constaté que cette surcharge s'élevait à ~ 1 ms sur un serveur déchargé. (Ce nombre est susceptible d'être plus élevé sous charge, où les demandes entreront en concurrence pour l'accès au disque.)Avec d'
router
abord, une requête correspondant à un itinéraire n'a jamais à frapper le disque, ce qui permet d'économiser de précieuses millisecondes.Bien sûr, il existe des moyens d'atténuer
static
les frais généraux de.La meilleure option consiste à placer toutes vos ressources statiques dans un dossier spécifique. (IE
/static
) Vous pouvez ensuite monterstatic
sur ce chemin afin qu'il ne s'exécute que lorsque le chemin commence par/static
:Dans cette situation, vous mettriez cela ci-dessus
router
. Cela évite de traiter d'autres middlewares / le routeur si un fichier est présent, mais pour être honnête, je doute que vous gagniez autant.Vous pouvez également utiliser
staticCache
, qui met en cache les ressources statiques en mémoire afin que vous n'ayez pas à frapper le disque pour les fichiers fréquemment demandés. ( Avertissement:staticCache
sera apparemment supprimé à l'avenir.)Cependant, je ne pense pas que
staticCache
les réponses négatives en cache (quand un fichier n'existe pas), donc cela n'aide pas si vous avez misstaticCache
ci-dessusrouter
sans le monter sur un chemin.Comme pour toutes les questions sur les performances, mesurez et comparez votre application réelle (sous charge) pour voir où se trouvent réellement les goulots d'étranglement.
Express 4
Express 4.0 supprime
app.router
. Tous les middleware (app.use
) et routes (app.get
et al) sont désormais traités dans l'ordre précis dans lequel ils sont ajoutés.En d'autres termes:
En savoir plus sur les modifications dans Express 4.
la source
router
va en un seul endroit. Si, la première fois que vous appelezapp.get
(oupost
ou autres), vous ne l' avez pas encoreuse
dapp.router
, Express , il vous ajoute.static
Afterrouter
, la question sur les autres middlewares devient sans objet puisqu'elle doit être au dessus du routeur.app.router
est supprimé dans la branche principale actuelle, qui sera express-4.0 . Chaque route devient un middleware distinct.la source
Dans la version express 4, nous pouvons facilement définir des itinéraires de la manière suivante:
server.js:
route.js:
Dans,
server.js
nous avons importé l'objet routeur duroute.js
fichier et l' avons appliqué de la manière suivanteserver.js
:Maintenant, tous les itinéraires du
route.js
ont l'URL de base suivante:http: // localhost: 3000 / route
Pourquoi cette approche:
Le principal avantage de cette approche est que notre application est désormais plus modulaire . Tous les gestionnaires de route pour une certaine route peuvent maintenant être placés dans des fichiers différents, ce qui rend tout plus facile à gérer et à trouver.
la source