Differenza tra app.use () e router.use () in Express


92

Stavo solo leggendo la documentazione su express e ho trovato questi due termini, app.use();erouter.use();

So che app.use();viene utilizzato nel nodo per il montaggio di un middleware in un percorso e spesso lo usiamo nella maggior parte delle app del nodo. ma cosa router.use();sono entrambi uguali? se no, qual è la differenza?

Ho letto del router qui . Ho anche trovato domande simili su SO Qual è la differenza tra "express.Router" e il routing utilizzando "app.get"? e Differenza tra app.all ('*') e app.use ('/') , ma non rispondono realmente alla mia domanda. Grazie.

Risposte:


126

router.getserve solo per definire i sottopercorsi. Considera questo esempio:

var router = express.Router();

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

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

router.get('/user', bigger);
  • Se apri / first / sud , poi il filesmaller funzione verrà chiamata.
  • Se apri / first / user , la biggerfunzione verrà chiamata.

In breve, app.use('/first', router)monta il middleware prima nel percorso / , quindi router.getimposta il sottopercorso di conseguenza.


Ma se invece usiamo quanto segue:

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

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

app.get('/user', smaller);
  • Se apri / prima nel tuo browser,fun verrai chiamato,
  • Per / sud ,bigger verrà chiamato
  • Per / user , smallerverrà chiamato

Ma ricorda per / first / sud , nessuna funzione verrà chiamata.

Questo collegamento può anche aiutare: http://expressjs.com/api.html#router


Ho modificato la mia risposta @NaeemShaikh pls have a relook.
— Sudhanshu Gaur

4
Ma perché usare il router quando puoi andare app.use ('/ first / sud', più piccolo); e app.use ('/ first / user', più grande)? Voglio dire, hanno creato un router in modo da non dover digitare cose extra nel primo parametro?
— mskw

bella domanda guarda non lo so correttamente ma penso che questa sia la cosa che in realtà il routing è stato fatto per direzionare gli URL dove app.use è fatto per il middleware ora puoi usare app.use ('/ first / sud', più piccolo); ma supponiamo che nella tua app tu abbia molti percorsi che iniziano come / primo / secondo / terzo / quarto ora faresti ogni percorso qui / primo / secondo / terzo / quarto / x, no userai il router qui ricorda entrambi funzionano alla grande ma il router è stato creato solo per questi scopi URL
— Sudhanshu Gaur

Quindi, significa che non possiamo fare l'annidamento usando router. Possiamo farlo solo da app. È corretto?
— Mr_Perfect

1
Perché l'OP chiede in merito router.usema questa risposta risponde riferendosi router.get?
— Tim Heilman

74

router.use();monta il middleware per le rotte servite dal router specifico, app.use();monta il middleware per tutte le rotte dell'app (o quelle che corrispondono alle rotte specificate se si utilizzaapp.use('/ANYROUTESHERE', yourMiddleware()); ).

Un caso d'uso di esempio potrebbe essere un'app con un router con percorsi standard e un router che gestisce percorsi API, che richiedono un utente valido.

Dovresti quindi montare il middleware di autenticazione per il router API solo con router.use(yourAuthMiddleware()); .

Se hai un'app che richiede un utente valido per tutti i percorsi, monta il middleware per l'app con app.use(yourAuthMiddleware());


Posso creare un nuovo router e poi usein un altro router? Mi piacerouter1.use('/path', router2);
— CodyBugstein

6
Questa risposta è chiara e dovrebbe essere la risposta accettata. Il router viene spesso utilizzato in modo improprio laddove l'app sarebbe più appropriata.
— AturSams

1

app.use () utilizzato per Monta la funzione o le funzioni middleware nel percorso specificato, la funzione middleware viene eseguita quando la base del percorso richiesto corrisponde a path.

router.use () viene utilizzato per funzioni o funzioni middleware, il percorso di montaggio predefinito è "/".

Ma in app.use () dovrai dare un percorso specificato in questo modo:

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

o

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

  // write your callback code here.

    });

Ma mentre usi router.use () puoi fornire solo middleware, in questo modo:

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

o

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

o

//in router.js

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

Nel codice precedente, quando il punto finale è '/ admin', prima chiamerà authUtil.verifySessionId e authUtil.verifyLisencee, quindi eseguirà la riga successiva con il punto finale 'admin' e secondo il metodo controllerIndex.ads.adListingAdmin.


1
Non è necessario fornire un percorso app.usese si desidera eseguire la funzione per ogni richiesta effettuata all'app.
— jacefarm

@shubham Mi hai spiegato molto bene e mi è stato di grande aiuto. In caso di router con middleware, possiamo anche unirlo in una singola riga come router.delete ("/: id / delete", middleware.checkToken, userController.deleteUser)
— Sourabh Bhutani
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.