2016-01-21 211 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 –