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.

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


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());


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.