Разница между 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)
Сураб Бутани