Je commence par NodeJS et Express 4, et je suis un peu confus. J'ai lu le site Web Express, mais je ne vois pas quand utiliser un gestionnaire d'itinéraire ou quand l'utiliser express.Router
.
Comme je pouvais le voir, si je veux afficher une page ou quelque chose lorsque l'utilisateur frappe /show
par exemple, je devrais utiliser:
var express = require('express')
var app = express()
app.get("/show", someFunction)
Au début, je pensais que c'était vieux (pour Express 3). Est-ce exact ou c'est la voie pour Express 4 aussi?
Si c'est la façon de le faire dans Express 4, à quoi express.Router
sert-il?
J'ai lu presque le même exemple que ci-dessus mais en utilisant express.Router
:
var express = require('express');
var router = express.Router();
router.get("/show", someFunction)
Alors, quelle est la différence entre les deux exemples?
Lequel dois-je utiliser si je veux simplement faire un site Web de test simple?
Router
pas.listen()
pour les demandes en soi. Il est utile pour séparer votre application en plusieurs modules - en créant unRouter
dans chacun quiapp
peutrequire()
et en.use()
tant que middleware.app.get(..)
syntaxe n'est qu'un raccourci pour rendre le travailexpress.router
plus pratique. Si vous débutez, ne vous inquiétez pas des spécificités du routeur.app's
propres méthodes de routage, telles queapp.get()
, sont suffisantes pour vos besoins, utilisez-les. LeRouter
est juste là pour plus de commodité pour vous aider à organiser l'application sur plusieurs modules. Extrait du guide : " Laexpress.Router
classe peut être utilisée pour créer des gestionnaires d'itinéraire modulables. UneRouter
instance est un middleware complet et un système de routage; pour cette raison, elle est souvent appelée" mini-application ". "Réponses:
app.js
dogs.js
Lorsque
var app = express()
est appelé, un objet d'application est renvoyé. Considérez cela comme l' application principale .Lorsque
var router = express.Router()
est appelé, une mini-application légèrement différente est renvoyée. L'idée derrière la mini-application est que chaque itinéraire de votre application peut devenir assez compliqué, et vous auriez avantage à déplacer tout ce code dans un fichier séparé. Le routeur de chaque fichier devient une mini-application , qui a une structure très similaire à l' application principale .Dans l'exemple ci-dessus, le code de l' itinéraire / dogs a été déplacé dans son propre fichier afin de ne pas encombrer l' application principale . Le code pour / chats et / oiseaux serait structuré de manière similaire dans leurs propres fichiers. En séparant ce code en trois mini-applications , vous pouvez travailler sur la logique de chacune d'elles de manière isolée, et ne pas vous soucier de la façon dont cela affectera les deux autres.
Si vous avez du code (middleware) qui se rapporte aux trois routes, vous pouvez le mettre dans l' application principale , avant les
app.use(...)
appels. Si vous avez du code (middleware) qui ne concerne qu'une seule de ces routes, vous pouvez le mettre dans le fichier pour cette route uniquement.la source
app.use('/dogs', dogs)(app)
puisque vous y définissez des itinéraires, et en plus (et corrigez-moi si je me trompe) si vous le faites de cette façon, l'objet d'application a tout le middleware précédemment placé dessus et un middleware supplémentaire sera ajouté à l'objet d'application (en supposant que plus de middleware se trouve dans la route des chiens). si vous l'utilisez,route.get('/dogs', route)
il transmet uniquement le middleware à l'objet app lors de l'interaction avec les routes définies dans ce routeur et si la portée de l'application est en dehors de la route, il n'a pas accès à ce middleware.app.use('/dogs', show)
. De cette façon, l'itinéraire est indépendant de l'application et peut être réutilisé dans n'importe quelle application Express. Middleware placé n'importe où avant qu'un itinéraire ne soit utilisé par cet itinéraire. Si vous placez le middleware au-dessus de toutes les routes dans app.js, alors toutes les routes utiliseront ce middleware. Si vous placez un middleware dans un fichier d'itinéraire (dogs.js), seul cet itinéraire l'utilisera. Si vous placez le middleware après la route GET dans dogs.js, alors seule la route POST l'utilisera (tant qu'elle se termine par une réponse).app.get('/dogs'dogs,)(app)
car la question portait sur la fonction get de app.get et route.get. vous montriez comment séparer les itinéraires pour les rendre gérables. Mais mon anacdote ne serait-elle pas correcte si nous parlonsapp.get
? Si je peux obtenir sur un PC, je modifierai mon commentaire ci-dessus.Router
ne fait pas.listen()
de demandes à lui tout seul". Cela pourrait être la principale différence.Express 4.0 est livré avec le nouveau routeur. Comme mentionné sur le site:
Il y a un bon article sur https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4 qui décrit les différences et ce qui peut être fait avec les routeurs.
Résumer
Avec les routeurs, vous pouvez plus facilement modulariser votre code. Vous pouvez utiliser des routeurs comme:
Remarque:
L'
app.router
objet, qui a été supprimé dans Express 4, a fait son retour dans Express 5. Dans la nouvelle version, il s'agit simplement d'une référence au routeur Express de base, contrairement à Express 3, où une application devait le charger explicitement.la source
Comme dans l'exemple ci-dessus, nous pouvons ajouter différentes méthodes de requête HTTP sous une route.
la source
Disons que votre application est peu complexe. Donc, ce que nous faisons d'abord, c'est que nous divisons l'application en plusieurs modules afin que les changements dans un module n'encombrent pas les autres et que vous puissiez continuer à travailler sur des modules individuels, mais à la fin de la journée, vous devez tout intégrer en un depuis que vous construisent une seule application. C'est comme si nous avions une application principale et quelques applications enfants dont le parent est l'application principale. Ainsi, lorsque nous créons l'application parente, nous en créons une en utilisant
Et pour cette application parent, nous devons apporter les applications enfants. Mais comme les applications enfants ne sont pas des applications totalement différentes (puisqu'elles s'exécutent dans le même terme java), express fournit le moyen de le faire au moyen de la fonction de routeur de l'express et c'est ce que nous faisons dans chaque fichier de module enfant et permet d'appeler un de ces modules enfants comme aboutme .
Par module.exports, nous rendons ce module disponible pour les autres utilisateurs et comme nous avons des choses modulaires, nous devons rendre les fichiers de module disponibles pour l'application parent au moyen de la fonction require du nœud, comme tous les autres modules tiers et le fichier parent ressemble quelque chose comme ça.
Après avoir mis ce module enfant à la disposition du parent, nous devons indiquer à l'application parent quand utiliser cette application enfant. Disons que lorsqu'un utilisateur atteint le chemin aboutme, nous avons besoin de l'application enfant sur moi pour gérer la demande et nous le faisons en utilisant la méthode d' utilisation d'Express .
et d'un coup le fichier parent ressemble à ceci
Surtout, ce que le parent peut faire, c'est qu'il peut démarrer un serveur là où l'enfant ne peut pas. J'espère que cela clarifie. Pour plus d'informations, vous pouvez toujours consulter le code source, ce qui prend un certain temps, mais il vous donne beaucoup d'informations. Je vous remercie.
la source
parent.use('/aboutme', child)
?utiliser app.js pour écrire des itinéraires signifie qu'ils sont accessibles à tous les utilisateurs car app.js est chargé au démarrage de l'application. Cependant, le fait de mettre des itinéraires dans des mini-applications express.router () protège et restreint leur accessibilité.
la source
express.Router
a de nombreuses options:/show
itinéraire n'est pas le même que/Show
, ce comportement est désactivé par défaut/show/
route vers différent de/show
, ce comportement est également désactivé par défautla source
En un mot,
express.Router
peut faire plus de choses par rapport àapp.get()
, comme un middleware, en outre, vous pouvez définir un objet routeur supplémentaire avecexpress.Router()
la source