Разница между app.use () и router.use () в Express


87

Я просто читал документацию по экспресс и нашел эти два термина, app.use();иrouter.use();

Я знаю, что app.use();он используется в узле для монтирования промежуточного программного обеспечения по пути, и мы часто используем его в большинстве узловых приложений. но что router.use();они оба одинаковы? если нет, в чем разница?

Я читал про роутер здесь . Я также нашел похожие вопросы на SO В чем разница между "express.Router" и маршрутизацией с использованием "app.get"? и Разница между app.all ('*') и app.use ('/') , но они не отвечают на мой вопрос. Спасибо.

Ответы:


122

router.getпредназначен только для определения подпути. Рассмотрим этот пример:

var router = express.Router();

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

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

router.get('/user', bigger);
  • Если вы откроете / first / sud , smallerфункция будет вызвана.
  • Если вы откроете / first / user , biggerфункция будет вызвана.

Короче говоря, сначалаapp.use('/first', router) монтирует промежуточное ПО по пути / , а затем соответственно router.getустанавливает подпуть.


Но если мы вместо этого воспользуемся следующим:

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

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

app.get('/user', smaller);
  • Если вы откроете / сначала в своем браузере, вам позвонят fun,
  • Для / пены , biggerбудет вызвано
  • Для / пользователя , smallerбудет вызван

Но помните, что для / first / sud функция не вызывается.

Эта ссылка также может помочь: http://expressjs.com/api.html#router


Я отредактировал свой ответ @NaeemShaikh, пожалуйста, пересмотрите.
— Судханшу Гаур

4
Но зачем использовать маршрутизатор, если можно использовать app.use ('/ first / sud', меньше); и app.use ('/ first / user', больше)? Я имею в виду, они создали маршрутизатор, чтобы нам не нужно было вводить лишний материал в первый параметр?
— mskw 07

хороший вопрос, смотри, я не знаю это правильно, но я думаю, что на самом деле маршрутизация была сделана для определения URL-адресов, где app.use выполняется для промежуточного программного обеспечения, теперь вы можете использовать app.use ('/ first / sud', меньше); но предположим, что в вашем приложении у вас есть много маршрутов, начинающихся как / first / second / third / 4th, теперь вы бы сделали каждый маршрут здесь / first / second / third / 4th / x, нет, вы будете использовать здесь маршрутизатор, помните, что оба работают отлично, но маршрутизатор был создан только для этих целей
— Судханшу Гаур

Итак, это означает, что мы не можем использовать вложенность router. Мы можем обойтись только путем app. Это верно?
— Mr_Perfect

Почему OP спрашивает, router.useно этот ответ отвечает на router.get?
— Тим Хейлман

72

router.use();монтирует промежуточное ПО для маршрутов, обслуживаемых определенным маршрутизатором, app.use();монтирует промежуточное ПО для всех маршрутов приложения (или тех, которые соответствуют маршрутам, указанным, если вы используете app.use('/ANYROUTESHERE', yourMiddleware());).

Примером использования может быть приложение с одним маршрутизатором со стандартными маршрутами и одним маршрутизатором, который обрабатывает маршруты api, для которых требуется действующий пользователь.

Затем вы должны установить промежуточное ПО для аутентификации для маршрутизатора api только с router.use(yourAuthMiddleware());.

Если у вас есть приложение, для которого требуется действующий пользователь для всех маршрутов, смонтируйте промежуточное ПО для приложения с помощью app.use(yourAuthMiddleware());


Могу ли я создать новый маршрутизатор, а затем useего в другом маршрутизаторе? Нравитсяrouter1.use('/path', router2);
— CodyBugstein

6
Этот ответ ясен и должен быть принятым. Маршрутизатор часто используется не по назначению там, где приложение было бы более подходящим.
— AturSams

1

app.use (), используемый для монтирования функции или функций промежуточного программного обеспечения по указанному пути, функция промежуточного программного обеспечения выполняется, когда основа запрошенного пути совпадает с путем.

router.use () используется для функции или функций промежуточного программного обеспечения. По умолчанию путь монтирования - «/».

Но в app.use () вам нужно будет указать указанный путь следующим образом:

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

или

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

  // write your callback code here.

    });

Но при использовании router.use () вы можете использовать только промежуточное ПО, например:

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

или

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

или

//in router.js

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

В приведенном выше коде, когда конечной точкой является '/ admin', сначала он вызовет authUtil.verifySessionId и authUtil.verifyLisencee, затем он выполнит следующую строку с конечной точкой 'admin' и в соответствии с методом controllerIndex.ads.adListingAdmin.


1
Путь к нему не требуется, app.useесли вы хотите выполнять функцию для каждого запроса к приложению.
— jacefarm

@shubham Вы очень хорошо объяснили, и это очень помогло мне. В случае маршрутизатора с промежуточным программным обеспечением мы также можем объединить его в одну строку, например router.delete ("/: id / delete", middleware.checkToken, userController.deleteUser)
— Сураб Бутани
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.