#javascript #node.js #express #callback #web-development-server
#javascript #node.js #экспресс #обратный вызов #веб-разработка-сервер
Вопрос:
Я смотрел учебник по Express framework, и инструктор использовал следующий код при обработке запроса.
Маршрут выглядит следующим образом:
router.route('/').post(authController.restrictTo('admin', 'lead-guide'));
Обработчик запроса выглядит следующим образом:
exports.restrictTo = (...roles) => {
return (req, res, next) => {
/* Some logic related to roles */
next();
};
};
Мой вопрос заключается в том, что когда клиент отправляет запрос на указанный выше маршрут, вызывается соответствующий обработчик (restrictTo) — это делается с помощью Express.
Но обработчик restrictTo
возвращает другую функцию (промежуточное программное обеспечение), которая принимает req, res, next
в качестве аргументов. Итак, это означает, что Express сначала вызывает restrictTo, а затем ожидает, пока он вернет другую функцию, и снова вызовет эту вновь возвращенную функцию с параметрами req, res, next ?
Ответ №1:
В express промежуточные ПРОГРАММЫ — это функции с тремя аргументами req, res, next
. В промежуточном программном обеспечении у вас есть доступ только к запросу, ответу и следующей функции. В вашем примере он использует оператор распространения для добавления аргументов для функции промежуточного программного обеспечения. Когда он возвращает функцию промежуточного программного обеспечения, теперь она в основном
(req, res, next) => {
const role = roles[0]; // ACCESS TO ROLES
/* Some logic related to roles */
next();
};
Итак, чтобы ответить на ваш вопрос, это не совсем ожидание, но в основном да.
Ответ №2:
Не совсем, но вы близки к этому. restrictTo
Функция вызывается сразу после запуска вашего приложения. При restrictTo
вызове он возвращает middleware
функцию. Затем каждая middleware
функция вызывается в том порядке, в котором они применяются.
Так , например:
const router = express.Router
// No middleware applied yet so any request to this route will go straight to handler i.e.res.json()
router.get('/unrestricted', (req, res, next) => res.json({}));
router.use(authController.restrictTo('admin', 'lead-guide'));
// Any request to this endpoint will pass through the middleware
// returned by the authController.restrictTo function
router.get('/restricted', (req, res, next) => res.json({}));
// Any request to this route will pass through the restrictTo middleware
// and another middleware function that will do a console.log
router.get('/restricted/other', (req, res, next) => {
console.log('another middleware function');
next();
}, (req, res, next) => res.json({});
Примечание: действительно важно, чтобы любая функция промежуточного программного обеспечения вызывала next
функцию, чтобы разрешить вызов следующей функции в цепочке (будь то обработчик, т. Е. Функция, Которая в конечном итоге отправит ответ, или другая функция промежуточного программного обеспечения и т.д.).
Комментарии:
1. Я добавил console.log(‘Before return’) перед возвратом в restrictTo, и я мог бы, как только приложение будет запущено, ‘Before return’ будет напечатано в консоли. — Это означает, что Express пытается выполнить все функции, которые определены при запуске сервера. Я прав и почему это происходит до каких-либо запросов?
2. Потому что вы вызываете функцию. Создание вашего сервера и маршрутов — это все набор функций, которые вызываются при запуске приложения. Частью этого является применение функций промежуточного программного обеспечения. Функция restrictTo не является промежуточным программным обеспечением. Это функция, которая при ее вызове (при запуске приложения) возвращает функцию промежуточного программного обеспечения. Эта возвращенная функция промежуточного программного обеспечения будет вызываться на всех маршрутах, к которым была применена функция промежуточного программного обеспечения. Вот почему вы видите журнал при запуске.