2016-01-21 265 views
1

是否可以使用Express.Router创建不共享中间件的不同路由器?封装快速路由器

对我来说,似乎Express.Router使用单身,所以无论我尝试什么,中间件都会连接到所有路由器。所以,无需创建的快捷应用程序的多个实例,是有办法做到以下几点:

创建复式路由器

var router_a = Express.Router(); 
var router_b = Express.Router(); 

给每个路由器独特的路线和中间件

router_a.use(function(req, res, next){ 
    console.log('Only works on router_a!'); 
}); 
router_a.get('/', function(req, res){ 
    console.log('Only works on router_a!'); 
}); 

router_b.use(function(req, res, next){ 
    console.log('Only works on router_b!'); 
}); 
router_b.get('/', function(req, res){ 
    console.log('Only works on router_b!'); 
}); 

将每个路由附加到自定义url命名空间

app.use('/a', router_a); 
app.use('/b', router_b); 

是否有直接的方法来实现这一点?在阅读路由器上的文档之后,我没有看到任何暗示这种可能的东西。

+1

是的,你可以根据需要和各自为对方完全独立,并可以在自己的URL命名空间的子集工作,有许多路由器。这是在[快速文档](http://expressjs.com/en/guide/routing.html#express-router)中解释的。在这个特定的例子中,'/ birds/*'由一个路由器实例处理,您可以为其他顶级路径重复多次。而且,顶级路由器也可以在其中具有子路由器。每个路由器都有自己的中间件,只有在涉及到路由器的路径时才会触发。 – jfriend00

+0

这似乎没有按照您的说法工作。当我设置多个路由器时,不匹配的路由器的middlware仍然会在所有路由上执行。 –

+0

你可能会发表一个工作的例子吗?因为我可能做错了一些事情。 @ jfriend00 –

回答

1

我从代码中看到的一件事是在中间件中调用next()。如果我将它添加到您的代码中,它对我来说工作得很好。

仅当路由以/b开头并且/a中间件与/a路由相同时才调用/b中间件。而且,要完成您的代码,您还必须在您的.get()处理程序中发送回复。

下面是具体的代码我只是测试:

var express = require('express'); 
var app = express(); 

var server = app.listen(80); 

app.use(express.static('public')); 

var router_a = express.Router(); 
var router_b = express.Router(); 

router_a.use(function(req, res, next){ 
    console.log('.use() - Only works on router_a!'); 
    next(); 
}); 
router_a.get('/', function(req, res){ 
    console.log('.get() - Only works on router_a!'); 
    res.send("router a,/route"); 
}); 

router_b.use(function(req, res, next){ 
    console.log('.use() - Only works on router_b!'); 
    next(); 
}); 
router_b.get('/', function(req, res){ 
    console.log('.get() - Only works on router_b!'); 
    res.send("router b,/route"); 
}); 

app.use('/a', router_a); 
app.use('/b', router_b); 
+0

哦,看起来,那有效!嗯,我想知道为什么我的执行不起作用?我有路由器和应用程序抽象,所以我猜我需要深入一点。我知道它应该像我期望的那样工作,我感觉更加理智。谢谢。 –

+0

原来我只是需要更新我的快递版本。再次感谢您的帮助@ jfriend00 –