Прыжки к разной цепи маршрутов в экспресс
Я обнаружил довольно полезное устройство в Express, чтобы перейти к новой цепочке промежуточного ПО в Express
скажем, что у нас есть это:
router.post('/', function(req,res,next){
next();
}, function(req,res,next){
next('route'); //calling this will jump us down to the next router.post call
}, function(req,res,next){ //not invoked
next();
}, function(err,req,res,next){
//definitely not invoked
});
router.post('/', function(req,res,next){ //this gets invoked by the above next('route') call
next();
}, function(err,req,res,next){
});
Я мог видеть, где это может быть полезно, и я пытаюсь выяснить, как это работает.
Проблема, которую я вижу, заключается в том, что это решение, похоже, немного ударяет по дороге. Я хочу, чтобы иметь возможность вызвать следующий ( "route: a" ) или следующий ( "route: b" ), поэтому я могу выбрать, какой обработчик вызывается по имени, а не только в следующем списке.
В качестве примера у меня есть следующее:
router.post('/', function (req, res, next) { //this is invoked first
console.log(1);
next('route');
});
router.post('/', function (req, res, next) { //this is invoked second
console.log(2);
next('route');
});
router.use('foo', function (req, res, next) { //this gets skipped
console.log(3);
});
router.post('bar', function (req, res, next) { //this get skipped
console.log(4);
});
router.post('/', function(req,res,next){ // this gets invoked third
console.log(5);
});
То, что я ищу, - это способ вызвать "foo" и "bar" по имени. Есть ли способ сделать это с помощью Express?
Ответы
Ответ 1
На самом деле next('route')
перейдите на следующий маршрут, но ваш url /
not foo
, чтобы он пропустил это и перешел к следующим маршрутам, пока не найдет соответствующий, что происходит в последнем случае, и вы получите 5
в консоли
Если вы хотите, вы можете просто изменить req.url
на что-то вроде foo
или что-то еще, тогда он войдет в этот маршрут (и он не пропустит middleares для этого маршрута), или вы можете сделать что-то вроде res.redirect
, затем вызов снова появится из клиента
router.post('/', function (req, res, next) { //this is invoked second
console.log(2);
req.url="foo";
next('route');
});
На самом деле подход @zag2art хорош. В конце дня вы должны урать код достаточно умным, чтобы элегантно обрабатывать ваши дела. Экспресс не предоставляет ничего как такового для перехода к определенному маршруту
Ответ 2
Почему у вас нет только что-то вроде этого:
router.post('/', function (req, res, next) { //this is invoked first
console.log(1);
foo(req, res, next);
});
router.post('/', function (req, res, next) { //this is invoked second
console.log(2);
bar(req, res, next);
});
function foo(req, res, next) {
console.log(3);
};
function bar(req, res, next) {
console.log(4);
};
router.post('/', function(req,res,next){ // this gets invoked third
console.log(5);
});