Différence entre app.use () et router.use () dans Express

87

Je lisais juste la documentation sur express et j'ai trouvé ces deux termes, app.use();etrouter.use();

Je sais qu'il app.use();est utilisé dans le nœud pour monter un middleware sur un chemin, et nous l'utilisons souvent dans la plupart des applications de nœud. mais qu'est-ce router.use();qu'ils sont tous les deux identiques? sinon, quelle est la différence?

J'ai lu sur le routeur ici . J'ai également trouvé des questions similaires sur SO Quelle est la différence entre "express.Router" et le routage en utilisant "app.get"? et Différence entre app.all ('*') et app.use ('/') , mais ils ne répondent pas vraiment à ma question. Merci.

Naeem Shaikh
la source

Réponses:

122

router.getsert uniquement à définir les sous-chemins. Prenons cet exemple:

var router = express.Router();

app.use('/first', router); // Mount the router as middleware at path /first

router.get('/sud', smaller);

router.get('/user', bigger);
  • Si vous ouvrez / first / sud , la smallerfonction sera appelée.
  • Si vous ouvrez / first / user , la biggerfonction sera appelée.

En bref, app.use('/first', router)monte le middleware sur path / first , puis router.getdéfinit le sous-chemin en conséquence.


Mais si nous utilisons à la place ce qui suit:

app.use('/first', fun);

app.get('/sud', bigger);

app.get('/user', smaller);
  • Si vous ouvrez / d'abord dans votre navigateur, funsera appelé,
  • Pour / sud , biggersera appelé
  • Pour / user , smallersera appelé

Mais rappelez-vous que pour / first / sud , aucune fonction ne sera appelée.

Ce lien peut également aider: http://expressjs.com/api.html#router

Sudhanshu Gaur
la source
J'ai édité ma réponse @NaeemShaikh pls ont un relook.
Sudhanshu Gaur
4
Mais pourquoi utiliser un routeur lorsque vous pouvez accéder à app.use ('/ first / sud', plus petit); et app.use ('/ premier / utilisateur', plus grand)? Je veux dire, ont-ils créé un routeur pour que nous n'ayons pas à taper des éléments supplémentaires dans le premier paramètre?
mskw
belle question regarde je ne le sais pas correctement mais je pense que c'est la chose en fait que le routage a été fait pour dicrecting sur les URL où app.use est fait pour le middleware maintenant vous pouvez utiliserpp.use ('/ first / sud', plus petit); mais supposons que dans votre application vous ayez de nombreuses routes commençant par / premier / deuxième / troisième / quatrième maintenant feriez-vous chaque route ici / premier / deuxième / troisième / quatrième / x, non vous utiliserez le routeur ici rappelez-vous que les deux fonctionnent très bien mais le routeur a été fait juste pour ces URL
Sudhanshu Gaur
Donc, cela signifie que nous ne pouvons pas faire d'imbrication en utilisant router. Nous ne pouvons faire que par app. Est-ce exact?
Mr_Perfect
Pourquoi le PO demande-t-il router.usemais cette réponse répond en faisant référence router.get?
Tim Heilman
72

router.use();monte le middleware pour les routes desservies par le routeur spécifique, app.use();monte le middleware pour toutes les routes de l'application (ou celles correspondant aux routes spécifiées si vous utilisez app.use('/ANYROUTESHERE', yourMiddleware());).

Un exemple de cas d'utilisation pourrait être une application avec un routeur avec des routes standard et un routeur qui gère les routes API, qui nécessitent un utilisateur valide.

Vous monterez alors le middleware d'authentification pour le routeur API uniquement avec router.use(yourAuthMiddleware());.

Si vous avez une application qui nécessite un utilisateur valide pour toutes les routes, montez le middleware pour l'application avec app.use(yourAuthMiddleware());

Laura
la source
Puis-je créer un nouveau routeur, puis le créer usedans un autre routeur? J'aimerouter1.use('/path', router2);
CodyBugstein
6
Cette réponse est claire et devrait être la réponse acceptée. Le routeur est souvent mal utilisé là où l'application serait plus appropriée.
AturSams
1

app.use () utilisé pour monter la ou les fonctions middleware sur le chemin spécifié, la fonction middleware est exécutée lorsque la base du chemin demandé correspond au chemin.

router.use () est utilisé pour la fonction ou les fonctions du middleware, le chemin de montage par défaut sur «/».

Mais dans app.use (), vous devrez donner un chemin spécifié comme celui-ci:

 var adsRouter = require('./adsRouter.js');
    app.use('/ads', adsRouter);

ou

app.use('/ads', function(req, res, next) {

  // write your callback code here.

    });

Mais en utilisant router.use (), vous ne pouvez donner qu'un middleware, comme ceci:

router.use(function(req, res, next) {
  console.log('%s %s %s', req.method, req.url, req.path);
  next();
});

ou

router.use('/test', function(req, res, next) {
  // write your callback code here.
  next();
});

ou

//in router.js

router.use('/admin', authUtil.verifySessionId, authUtil.verifyLisencee);
router.post('/admin', controllerIndex.ads.adListingAdmin);

Dans le code ci-dessus, lorsque le point final est '/ admin', il appellera d'abord authUtil.verifySessionId et authUtil.verifyLisencee, puis il exécutera la ligne suivante avec le point final 'admin' et selon la méthode controllerIndex.ads.adListingAdmin.

Shubham Verma
la source
1
Il n'est pas nécessaire de fournir un chemin d'accès app.usesi vous souhaitez exécuter la fonction pour chaque demande adressée à l'application.
jacefarm
@shubham Vous avez très bien expliqué et cela m'a été très utile. Dans le cas d'un routeur avec middleware, nous pouvons également le fusionner en une seule ligne comme router.delete ("/: id / delete", middleware.checkToken, userController.deleteUser)
Sourabh Bhutani