Unterschied zwischen app.use () und router.use () in Express

87

Ich habe gerade die Dokumentation auf Express gelesen und diese beiden Begriffe gefunden, app.use();undrouter.use();

Ich weiß, dass app.use();es in Node zum Mounten einer Middleware an einem Pfad verwendet wird, und wir verwenden es häufig in den meisten Node-Apps. aber was ist, router.use();sind sie beide gleich? Wenn nicht, was ist der Unterschied?

Ich las über Router hier . Ich habe auch ähnliche Fragen zu SO gefunden. Was ist der Unterschied zwischen "express.Router" und Routing mit "app.get"? und Unterschied zwischen app.all ('*') und app.use ('/') , aber sie beantworten meine Frage nicht wirklich. Vielen Dank.

Naeem Shaikh
quelle

Antworten:

122

router.getdient nur zum Definieren von Unterpfaden. Betrachten Sie dieses Beispiel:

var router = express.Router();

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

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

router.get('/user', bigger);
  • Wenn Sie / first / sud öffnen , wird die smallerFunktion aufgerufen.
  • Wenn Sie / first / user öffnen , wird die biggerFunktion aufgerufen.

Kurz gesagt, stellt app.use('/first', router)die Middleware zuerst unter Pfad /router.get bereit und legt dann den Unterpfad entsprechend fest.


Aber wenn wir stattdessen Folgendes verwenden:

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

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

app.get('/user', smaller);
  • Wenn Sie / zuerst in Ihrem Browser öffnen , funwird aufgerufen,
  • Für / sud , biggerwird aufgerufen
  • Für / user , smallerwird aufgerufen

Denken Sie jedoch daran, dass für / first / sud keine Funktion aufgerufen wird.

Dieser Link kann auch helfen: http://expressjs.com/api.html#router

Sudhanshu Gaur
quelle
Ich habe meine Antwort @NaeemShaikh bearbeitet. Bitte haben Sie einen Relook.
Sudhanshu Gaur
4
Aber warum Router verwenden, wenn Sie app.use gehen können ('/ first / sud', kleiner); und app.use ('/ first / user', größer)? Ich meine, haben sie einen Router erstellt, damit wir im ersten Parameter keine zusätzlichen Daten eingeben müssen?
mskw
nette Frage, schau, ich weiß es nicht richtig, aber ich denke, das ist die Sache, die tatsächlich gemacht wurde, um URLs zu korrigieren, bei denen app.use für Middleware gemacht ist. Jetzt kannst du useapp.use ('/ first / sud', kleiner) verwenden. Aber nehmen wir an, Sie haben in Ihrer App viele Routen mit dem Start als / erste / zweite / dritte / vierte. Würden Sie jetzt jede Route hier / erste / zweite / dritte / vierte / x erstellen? Nein, Sie werden hier einen Router verwenden. Denken Sie daran, dass beide großartig funktionieren, aber der Router wurde nur für diese URLs Zwecke gemacht
Sudhanshu Gaur
Das bedeutet, dass wir nicht mit verschachteln können router. Wir können nur durch tun app. Ist das korrekt?
Mr_Perfect
Warum fragt das OP nach, router.useaber diese Antwort bezieht sich auf router.get?
Tim Heilman
72

router.use();Mounten Middleware für die Routen, die vom jeweiligen Router bedient werden, app.use();Mounten Middleware für alle Routen der App (oder diejenigen, die den angegebenen Routen entsprechen, wenn Sie sie verwenden app.use('/ANYROUTESHERE', yourMiddleware());).

Ein Anwendungsbeispiel könnte eine App mit einem Router mit Standardrouten und einem Router sein, der API-Routen verarbeitet, für die ein gültiger Benutzer erforderlich ist.

Sie würden dann die Authentifizierungs-Middleware für den API-Router nur mit mounten router.use(yourAuthMiddleware());.

Wenn Sie jedoch eine App haben möchten, für die ein gültiger Benutzer für alle Routen erforderlich ist, stellen Sie die Middleware für die App mit bereit app.use(yourAuthMiddleware());

Laura
quelle
Kann ich einen neuen Router erstellen und dann usein einem anderen Router? Gefällt router1.use('/path', router2);
mir
6
Diese Antwort ist klar und sollte die akzeptierte Antwort sein. Der Router wird häufig dort missbraucht, wo die App besser geeignet ist.
AturSams
1

app.use (), mit dem die Middleware-Funktion oder -Funktionen am angegebenen Pfad bereitgestellt werden. Die Middleware-Funktion wird ausgeführt, wenn die Basis des angeforderten Pfads mit dem Pfad übereinstimmt.

router.use () wird für Middleware-Funktionen oder -Funktionen verwendet. Der Standard-Mount-Pfad lautet "/".

In app.use () müssen Sie jedoch einen bestimmten Pfad wie folgt angeben:

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

oder

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

  // write your callback code here.

    });

Bei Verwendung von router.use () können Sie jedoch nur Middleware wie folgt angeben:

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

oder

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

oder

//in router.js

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

Wenn der Endpunkt im obigen Code '/ admin' ist, ruft er zuerst authUtil.verifySessionId und authUtil.verifyLisencee auf und führt dann die nächste Zeile mit dem Endpunkt 'admin' und gemäß der Methode controllerIndex.ads.adListingAdmin aus.

Shubham Verma
quelle
1
Es muss kein Pfad angegeben werden, zu dem app.useSie die Funktion für jede an die App gesendete Anforderung ausführen möchten.
Jacefarm
@shubham Du hast es sehr gut erklärt und es war sehr hilfreich für mich. Im Falle eines Routers mit Middleware können wir ihn auch in eine einzelne Zeile wie router.delete ("/: id / delete", middleware.checkToken, userController.deleteUser) einfügen
Sourabh Bhutani