Різниця між app.use () та router.use () в Express


87

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

Я знаю app.use();, що використовується у node для монтування проміжного програмного забезпечення на шляху, і ми часто використовуємо його у більшості додатків node. але що 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зателефонують,
  • Для / sud , biggerзателефонують
  • Для / користувача , smallerбуде викликаний

Але пам’ятайте для / first / sud , жодна функція не буде викликана.

Це посилання також може допомогти: http://expressjs.com/api.html#router


Я відредагував свою відповідь @NaeemShaikh pls мають перегляд.
Судханшу Гаур,

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

приємне запитання, я не знаю його правильно, але я думаю, що це те, що насправді було зроблено для маршрутизації для URL-адрес, де app.use створено для проміжного програмного забезпечення. Тепер ви можете використовувати appp.use ('/ first / sud', менше); але припустимо, у вашому додатку у вас є багато маршрутів, які починаються як / перший / другий / третій / четвертий, тепер ви б робили кожен маршрут тут / перший / другий / третій / четвертий / х, ні, ви не будете використовувати маршрутизатор тут, пам'ятайте, що обидва чудово працюють, але маршрутизатор було зроблено саме для цих цілей URL-адрес
Sudhanshu Gaur

Отже, це означає, що ми не можемо робити вкладання за допомогою router. Ми можемо це зробити лише шляхом app. Це правильно?
Mr_Perfect

Чому ОП запитує щодо, 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' і відповідно до методу controIndex.ads.adListingAdmin.


1
Шлях не потрібно вказувати, app.useякщо ви хочете виконати функцію для кожного запиту, зробленого до програми.
jacefarm

@shubham Ви дуже добре пояснили, і це мені дуже допомогло. У випадку з маршрутизатором із проміжним програмним забезпеченням ми також можемо об'єднати його в один рядок, наприклад router.delete ("/: id / delete", middleware.checkToken, userController.deleteUser)
Sourabh Bhutani
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.