Какая разница между промежуточным ПО уровня приложения и маршрутизатора при маршрутизации в Express?
В Экспресс-документах говорится:
Средство промежуточного уровня приложения привязывается к экземпляру express, используя app.use() и app.VERB().
Средство промежуточного уровня уровня маршрутизатора работает как промежуточное ПО уровня приложения, за исключением того, что они привязаны к экземпляру express.Router()
. Система промежуточного программного обеспечения, созданная на уровне приложения в приведенном выше примере, может быть реплицирована на уровне маршрутизатора с использованием следующего кода.
В приложении, предоставленном генератором Express, я вижу в главном app.js
:
var routes = require('./routes/index');
app.use('/', routes);
И в ./routes/index.js
я вижу следующее:
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
module.exports = router;
Какова цель app.use
передать его router.get
вместо простого использования app.get
? И вообще, какая разница между app.VERB
и router.VERB
в терминах маршрутизации?
Ответы
Ответ 1
Какова цель приложения app.use передать его в router.get вместо простого использования app.get?
Все это просто проектирование для модульности. Это позволяет разделить приложение на несколько более мелких слабосвязанных фрагментов, и поскольку все они не имеют прямого знания об общем экземпляре app
, который объединяет их вместе, достигается модульность.
Например, вы можете создать целую подсистему учетной записи пользователя, которая обрабатывает регистрацию, вход в систему, забыл пароль и т.д. и делится ею между несколькими различными приложениями, "устанавливая" ее внутри них через app.use(require("my-user-system"))
.
Это единственная цель, стоящая за этим. Там нет никакой функциональной, технической или разницы в производительности.
И вообще, какая разница между app.VERB и router.VERB с точки зрения маршрутизации?
Никакой разницы. Приложение имеет собственный основной/основной маршрутизатор, а app.VERB
- это просто саксофон для удобства эквивалента app.router.VERB
.
Ответ 2
Пример поможет здесь:
В birds.js:
// birds.js
var express = require('express');
var router = express.Router();
// middleware that is specific to this router
router.use(function timeLog(req, res, next) {
console.log('Time: ', Date.now());
next();
});
// define the home page route
router.get('/', function (req, res) {
res.send('Birds home page');
});
В app.js:
// app.js
var birds = require('./birds');
app.use('/birds', birds);
Теперь запросы http://localhost:3000/birds/ будут отправляться в файл birds.js.
Этот модульный подход упростит работу с большой базой кода, так как приложение станет большим.
Источник: https://expressjs.com/en/guide/routing.html