307 votes

node.js / express.js - Comment fonctionne l'application.routeur de travail?

Avant de me poser à propos de app.router je pense que je devrais expliquer au moins ce que je pense qui se passe lorsque l'on travaille avec le middleware. Pour utiliser un middleware, la fonction à utiliser est - app.use(). Lorsque le middleware est exécuté, il va appeler la prochaine middleware en utilisant next() ou faites en sorte pas plus middleware appelée. Cela signifie que l'ordre dans lequel je place mes middleware appels est important parce que certains middleware dépend d'autres middleware, et certains middleware près de la fin, on peut même pas être appelé.

Aujourd'hui, je travaillais sur mon application, et a mon serveur en cours d'exécution en arrière-plan. Je voulais faire quelques modifications et actualiser ma page et voir les changements immédiatement. Plus précisément, j'ai été faire des changements à ma disposition. Je ne pouvais pas le faire fonctionner, j'ai donc cherché si pour la réponse et trouve cette question. Il dit à assurez-vous que express.static() sous require('stylus'). Mais quand j'étais à la recherche à l'OP du code, j'ai vu qu'il avait lui - app.router appel à la fin de son middleware appels, et j'ai essayé de comprendre pourquoi.

Quand j'ai fait ma demande expresse (version 3.0.0rc4), j'ai utilisé la commande express app --sessions --css stylus et dans mon app.js fichier le code d'installation avec mon app.router ci-dessus à la fois l' express.static() et require('stylus') des appels. Il semble donc que, si elle vient déjà de configuration de cette façon, alors il doit rester de cette façon.

Après ré-organiser mon code afin que je puisse voir mon Stylet changements, 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 savoir pourquoi il est important d'avoir encore app.router dans mon code. J'ai donc commenté, commencé mon application et navigué /. Il affiche ma page d'index de l'amende juste. Hmm, peut-être que cela a fonctionné parce que j'ai été l'exportation de la gamme à partir de mon fichier de routes (itinéraires.l'indice). Donc ensuite, j'ai navigué /test et de Test affichés sur l'écran. Haha ok, je n'ai aucune idée de ce qu' app.router . Si il est inclus dans mon code ou pas, mon routage est très bien. Donc, je suis définitivement en manque de quelque chose.

Voici Donc Ma Question:

Quelqu'un pourrait expliquer ce qu' app.router , l'importance de celui-ci, et où je devais la placer dans ma middleware appels? Il serait bien aussi si j'ai eu une brève explication sur express.static(). Aussi loin que je peux dire, express.static() est un cache de mes informations, et si l'application ne peut pas trouver la page demandée, il va vérifier le cache pour voir si elle existe.

333voto

josh3736 Points 41911

Remarque: Ceci décrit comment Exprimer travaillé dans les versions 2 et 3. Voir la fin de ce post pour plus d'informations sur Express 4.


static sert simplement des fichiers (statique ressources) à partir du disque. Donnez-vous un chemin (parfois appelé le point de montage), et il sert les fichiers dans ce dossier.

Par exemple, express.static('/var/www') servent les fichiers dans ce dossier. Ainsi, une demande à votre Nœud de serveur pour http://server/file.html servirait /var/www/file.html.

router est le code qui s'exécute vos itinéraires. Lorsque vous effectuez app.get('/user', function(req, res) { ... });, c'est l' router qui fait appelle la fonction de rappel pour traiter la demande.

La commande que vous passez de choses à app.use détermine l'ordre dans lequel chaque middleware est donné l'occasion de traiter une demande. Par exemple, si vous avez un fichier nommé test.html dans votre statique et un dossier de la route:

app.get('/test.html', function(req, res) {
    res.send('Hello from route handler');
});

Dont l'un est envoyé à un client qui demande http://server/test.html? Selon le middleware est donnée à l' use première.

Si vous faites cela:

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

Ensuite, le fichier sur le disque est servi.

Si vous le faites dans l'autre sens,

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

Ensuite, le gestionnaire d'itinéraire reçoit la demande, et "Bonjour de gestionnaire d'itinéraire" est envoyé au navigateur.

Habituellement, vous voulez mettre le routeur au-dessus de la statique middleware de sorte qu'un accidentellement-nom de fichier ne peut pas remplacer l'un de vos itinéraires.

Notez que si vous n'avez pas explicitement use le router, il est ajouté implicitement par l'Express à l'endroit où vous définissez un itinéraire (c'est pourquoi vos itinéraires toujours travaillé, même si vous commentée app.use(app.router)).


Un intervenant a apporté un autre point à propos de l'ordre du static et router que je n'avais pas abordé: l'impact sur votre application à la performance globale.

Une autre raison d' use router - dessus static est d'optimiser les performances. Si vous mettez de l' static d'abord, puis vous atteindrez le disque dur à chaque requête pour voir si un fichier existe. Dans un test rapide, j'ai trouvé que cette charge s'élève à ~1ms sur un déchargé serveur. (Ce nombre est beaucoup plus susceptibles d'être plus élevés en charge, où les demandes seront en compétition pour l'accès au disque.)

Avec router tout d'abord, une demande correspondant à un itinéraire n'a jamais touché le disque, permet d'économiser de précieuses millisecondes.

Bien sûr, il existe des moyens d'atténuer static's, de frais généraux.

La meilleure option est de mettre l'ensemble de vos ressources statiques, en vertu d'un dossier spécifique. (IE /static) Vous pouvez monter static de ce chemin qui ne fonctionne que lorsque le chemin d'accès commence par /static:

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

Dans cette situation, vous placez au-dessus de la router. Cela évite de traiter d'autres middleware/le routeur si un fichier est présent, mais pour être honnête, je doute que vous gagnez autant de points de.

Vous pouvez également utiliser staticCache, qui met en mémoire cache les ressources statiques dans la mémoire de sorte que vous n'avez pas à frapper le disque pour les fichiers demandés. (Avertissement: staticCache sera apparemment être supprimée dans le futur.)

Cependant, je ne pense pas qu' staticCache caches de réponses négatives (quand un fichier n'existe pas), donc ça n'aide pas si vous avez placé staticCache - dessus router sans montage à un chemin d'accès.

Comme avec toutes les questions sur la performance, de mesurer et d'évaluer votre application (sous charge) pour voir où les goulots d'étranglement sont vraiment.


Express 4

Express 4.0 supprime app.router. Tous les middlewares (app.use) et des routes (app.get et al) sont maintenant traitées exactement dans l'ordre dans lequel ils sont ajoutés.

En d'autres termes:

Toutes les méthodes de routage seront ajoutés dans l'ordre dans lequel ils apparaissent. Vous devriez pas faire app.use(app.router). Ceci élimine le problème le plus commun avec Express.

En d'autres termes, le mixage app.use() et app[VERB]() fonctionnera exactement dans l'ordre dans lequel ils sont appelés.

app.get('/', home);
app.use('/public', require('st')(process.cwd()));
app.get('/users', users.list);
app.post('/users', users.create);

Lire plus sur les changements dans l'Express 4.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X