我在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做到这一点?
答案 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);
});