Différences entre express.Router et app.get?

265

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 /showpar 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.Routersert-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?

nelson687
la source
27
Un Routerpas .listen()pour les demandes en soi. Il est utile pour séparer votre application en plusieurs modules - en créant un Routerdans chacun qui apppeut require()et en .use()tant que middleware.
Jonathan Lonowski
5
Comme l'indique @JonathanLonowski, la app.get(..)syntaxe n'est qu'un raccourci pour rendre le travail express.routerplus pratique. Si vous débutez, ne vous inquiétez pas des spécificités du routeur.
soulprovidr
1
vous dites donc que je ne devrais utiliser pour le moment que app.get ()? encore confus quant à savoir quand utiliser l'un ou l'autre
nelson687
11
@ nelson687 Il n'y a pas vraiment de règle stricte entre eux. Si vous pensez que les app'spropres méthodes de routage, telles que app.get(), sont suffisantes pour vos besoins, utilisez-les. Le Routerest juste là pour plus de commodité pour vous aider à organiser l'application sur plusieurs modules. Extrait du guide : " La express.Routerclasse peut être utilisée pour créer des gestionnaires d'itinéraire modulables. Une Routerinstance est un middleware complet et un système de routage; pour cette raison, elle est souvent appelée" mini-application ". "
Jonathan Lonowski

Réponses:

323

app.js

var express = require('express'),
    dogs    = require('./routes/dogs'),
    cats    = require('./routes/cats'),
    birds   = require('./routes/birds');

var app = express();

app.use('/dogs',  dogs);
app.use('/cats',  cats);
app.use('/birds', birds);

app.listen(3000);

dogs.js

var express = require('express');

var router = express.Router();

router.get('/', function(req, res) {
    res.send('GET handler for /dogs route.');
});

router.post('/', function(req, res) {
    res.send('POST handler for /dogs route.');
});

module.exports = router;

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.

Nocturno
la source
ne devriez-vous pas avoir à passer l'objet d'application 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.
Ravenous
1
Vous n'avez pas besoin de transmettre l'application à l'itinéraire, car l'itinéraire est transmis à l'application avec 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).
Nocturno
Ahh mon mauvais. Je voulais poser 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 parlons app.get? Si je peux obtenir sur un PC, je modifierai mon commentaire ci-dessus.
Ravenous
2
Mon application fonctionne toujours lorsque j'utilise express.Router () ou express (), je ne pouvais pas comprendre la différence :(
Ajay Suwalka
3
@Ajay Suwalka Je ne sais pas comment je peux développer davantage ce que j'ai déjà dit. Les documents disent "Un objet routeur est une instance isolée de middleware et de routes". J'aime aussi le commentaire de @Jonathan Lonowski ci-dessus, "A Routerne fait pas .listen()de demandes à lui tout seul". Cela pourrait être la principale différence.
Nocturno
29

Express 4.0 est livré avec le nouveau routeur. Comme mentionné sur le site:

La classe express.Router peut être utilisée pour créer des gestionnaires de routes montables modulaires. Une instance de routeur est un middleware complet et un système de routage; pour cette raison, elle est souvent appelée «mini-application».

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:

  1. Itinéraires de base: Accueil, À propos
  2. Acheminer le middleware pour consigner les demandes sur la console
  3. Route avec paramètres
  4. Route Middleware for Parameters pour valider des paramètres spécifiques
  5. Valide un paramètre transmis à une certaine route

Remarque:

L' app.routerobjet, 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.

Alireza Fattahi
la source
7
app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Post a random book')
  })

Comme dans l'exemple ci-dessus, nous pouvons ajouter différentes méthodes de requête HTTP sous une route.

TILAK
la source
5

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

var express = require('express');
var parent = express();

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 .

var express = require('express');
var router = express.Router();
/**
** do something here
**/
module.exports = router;

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.

var express = require('express') 
var parent = express() 
var child = require(./aboutme)

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 .

parent.use('/aboutme',  aboutme);

et d'un coup le fichier parent ressemble à ceci

var express = require('express');
var parent = express();
var child = require(./aboutme);
/***
**do some stuff here
**/
parent.use('/aboutme',child);

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.

raj240
la source
1
cela ne devrait-il pas être parent.use('/aboutme', child)?
Kees de Kooter
2

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é.

T.Soundarya
la source
2

express.Router a de nombreuses options:

  • activer la sensibilité à la casse: l' /showitinéraire n'est pas le même que /Show, ce comportement est désactivé par défaut
  • mode de routage strict: /show/route vers différent de /show, ce comportement est également désactivé par défaut
  • nous pouvons ajouter des middleware / s spécifiques à des routes spécifiques
Ahmed Alawady
la source
0

En un mot, express.Routerpeut faire plus de choses par rapport à app.get(), comme un middleware, en outre, vous pouvez définir un objet routeur supplémentaire avecexpress.Router()

yuanfang wang
la source