Różnica między app.use () i router.use () w Express

92

Właśnie czytałem dokumentację na ekspresie i znalazłem te dwa terminy app.use();irouter.use();

Wiem, że app.use();jest używany w węźle do montowania oprogramowania pośredniego na ścieżce i często używamy go w większości aplikacji węzłów. ale co to router.use();jest, że oboje są tacy sami? jeśli nie, jaka jest różnica?

O routerze przeczytałem tutaj . Znalazłem również podobne pytania w SO. Jaka jest różnica między „express.Router” a routingiem przy użyciu „app.get”? i różnica między app.all ('*') a app.use ('/') , ale tak naprawdę nie odpowiadają na moje pytanie. Dzięki.

Naeem Shaikh
źródło

Odpowiedzi:

126

router.getsłuży tylko do definiowania podścieżek. Rozważmy ten przykład:

var router = express.Router();

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

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

router.get('/user', bigger);
  • Jeśli otworzysz / first / sud , smallerfunkcja zostanie wywołana.
  • Jeśli otworzysz / first / user , biggerfunkcja zostanie wywołana.

Krótko mówiąc, app.use('/first', router)montuje oprogramowanie pośredniczące w path / first , a następnie odpowiednio router.getustawia podścieżkę.


Ale jeśli zamiast tego użyjemy następującego:

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

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

app.get('/user', smaller);
  • Jeśli otworzysz / pierwszy w przeglądarce, funzostaniesz wezwany,
  • Dla / Sud , biggerbędzie sprawdzony
  • Dla / użytkownika , smallerbędzie sprawdzony

Pamiętaj jednak, że w przypadku / first / sud żadna funkcja nie zostanie wywołana.

Może też pomóc ten link: http://expressjs.com/api.html#router

Sudhanshu Gaur
źródło
Zredagowałem moją odpowiedź @NaeemShaikh. Pls mają ponowne spojrzenie.
Sudhanshu Gaur
4
Ale po co używać routera, skoro można przejść do app.use ('/ first / sud', mniejsze); i app.use („/ first / user”, większe)? Chodzi mi o to, czy stworzyli router, więc nie musimy wpisywać dodatkowych rzeczy w pierwszym parametrze?
mskw
ładne pytanie, nie znam tego poprawnie, ale myślę, że właśnie to routing został utworzony w celu przekreślenia adresów URL, gdzie app.use jest stworzone dla oprogramowania pośredniego, teraz możesz użyćapp.use ('/ first / sud', mniejsze); ale załóżmy, że w swojej aplikacji masz wiele tras zaczynających się jako / pierwszy / drugi / trzeci / czwarty, czy utworzyłbyś teraz każdą trasę tutaj / pierwsza / druga / trzecia / czwarta / x, nie użyjesz tutaj routera pamiętaj, że oba działają świetnie, ale router został stworzony właśnie dla tych celów URL
Sudhanshu Gaur,
Oznacza to więc, że nie możemy zagnieżdżać przy użyciu router. Możemy to zrobić tylko przez app. Czy to jest poprawne?
Mr_Perfect
1
Dlaczego PO pyta o, router.useale ta odpowiedź odpowiada router.get?
Tim Heilman
74

router.use();montuje oprogramowanie pośredniczące dla tras obsługiwanych przez określony router, app.use();montuje oprogramowanie pośredniczące dla wszystkich tras aplikacji (lub tych, które pasują do określonych tras, jeśli używasz app.use('/ANYROUTESHERE', yourMiddleware());).

Przykładowym przypadkiem użycia może być aplikacja z jednym routerem ze standardowymi trasami i jednym routerem obsługującym trasy interfejsu API, które wymagają prawidłowego użytkownika.

Następnie montujesz oprogramowanie pośredniczące uwierzytelniania dla routera API tylko z router.use(yourAuthMiddleware());.

Jeśli jednak masz aplikację, która wymaga prawidłowego użytkownika dla wszystkich tras, zainstaluj oprogramowanie pośredniczące dla aplikacji z rozszerzeniem app.use(yourAuthMiddleware());

Laura
źródło
Czy mogę utworzyć nowy router, a następnie usew innym routerze? Podobnie jakrouter1.use('/path', router2);
CodyBugstein,
6
Ta odpowiedź jest jasna i powinna być odpowiedzią akceptowaną. Router jest często niewłaściwie używany, gdy aplikacja byłaby bardziej odpowiednia.
AturSams
1

app.use () służy do montowania funkcji lub funkcji oprogramowania pośredniego w określonej ścieżce, funkcja oprogramowania pośredniego jest wykonywana, gdy podstawa żądanej ścieżki jest zgodna ze ścieżką.

router.use () jest używany do funkcji lub funkcji oprogramowania pośredniego. Domyślna ścieżka montowania to „/”.

Ale w app.use () będziesz musiał podać określoną ścieżkę w ten sposób:

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

lub

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

  // write your callback code here.

    });

Ale używając router.use () możesz dać tylko oprogramowanie pośredniczące, na przykład:

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

lub

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

lub

//in router.js

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

W powyższym kodzie, gdy punktem końcowym jest „/ admin”, najpierw wywoła authUtil.verifySessionId i authUtil.verifyLisencee, a następnie wykona kolejną linię z punktem końcowym „admin” i zgodnie z metodą controllerIndex.ads.adListingAdmin.

Shubham Verma
źródło
1
Ścieżki nie trzeba podawać, app.usejeśli chcesz wykonać funkcję dla każdego żądania skierowanego do aplikacji.
jacefarm
@shubham Bardzo dobrze wyjaśniłeś i było to dla mnie bardzo pomocne. W przypadku routera z oprogramowaniem pośredniczącym możemy również połączyć go w jedną linię, np. Router.delete ("/: id / delete", middleware.checkToken, userController.deleteUser)
Sourabh Bhutani