Прыжки к разной цепи маршрутов в экспресс

Я обнаружил довольно полезное устройство в 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);
});