在Express中跳转到不同的路线链

时间:2016-01-14 01:14:05

标签: regex node.js express

我在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做到这一点?

2 个答案:

答案 0 :(得分:5)

实际上next('route')进入下一个路线但你的网址是/而不是foo所以它会跳过它并转到下一条路线,直到找到匹配的路线,最后发生案例,您在控制台

中获得5

如果你想要你可以将req.url更改为foo或类似的东西,那么它将进入该路线(并且它不会跳过该路线的中间人)或者你可以做类似的事情res.redirect然后再次来自客户

router.post('/', function (req, res, next) {  //this is invoked second
    console.log(2);
    req.url="foo";
    next('route');
});

实际上@ zag2art方法很好,在一天结束时你必须保持足够聪明的代码来优雅地处理你的案件。 Express没有提供任何东西来跳到特定路线

答案 1 :(得分:1)

为什么你没有这样的事情:

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);
});