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.