2016-02-15 29 views
3

給定兩個中間件,你如何添加一個會先被命中的東西,然後確定哪個中間件傳遞了請求。該請求只能被丟棄或轉發到其中一箇中間件,而不能同時發送。如何跳過或跳轉中間件? (節點)

app.use(function *(next) { 
    if (isAuthenticated) 
     *private middleware* 
    else 
     *use public middleware* 
}); 

更具體地:
我有一個主頁/應該取決於如果用戶已登錄在與否具有可變的響應(使用基於令牌的身份驗證這裏)。爲了簡單起見,如果請求用戶沒有令牌,則public.html是響應,而private.html是請求承載有效令牌。
現在這將很容易,只是在一個函數中實現,但我想分開路由器,這將保持代碼更易於管理。
所以我需要以某種方式能夠選擇哪個中間件路由器的請求去吧?不知道該怎麼做。

var publicR = new router(); 
publicR.get('/', function *(next) { 
    ....public.html.... 
}); 
var privateR = new router(); 
privateR.get('/', function *(next) { 
    ....private.html.... 
}); 

app.use(function(){ 
    if(isAuthenticated) 
     ...use privateR.routes(); 
    else 
     ...use publicR.routes(); 
}); 
+0

只需使用一個自定義中間件處理程序來檢查條件並自行決定調用哪個其他函數。 – jfriend00

+0

@ jfriend00對不起,我沒有關注,你認爲'要調用哪個函數'是什麼意思? – House3272

+0

而不是依賴中間件的菊花鏈,如果需要的話,調用你已經定義的函數,同時傳遞'req'和'res'。 –

回答

3

首先,這是不尋常的,真的不是一個好主意呈現完全不同的內容爲某個網址時登錄或沒有登錄。所以,試圖讓兩個不同的路由器都服務於相同的路由,但一個用於登錄用戶,另一個用於未登錄用戶可能不是一個好設計的想法。

更常見的情況是登錄時可能會有一部分頁面可能不同。在這種情況下,您有一條創建頁面的路由,可以在登錄時處理與內容稍有不同的事情。

如果您真的想在登錄時擁有完全不同的內容和行爲,那麼您在登錄時應該重定向到不同的URL。在這種情況下,您可以使用完全不同的路由器來「登錄」網址。這對搜索引擎也會更好,因爲給定的URL會報告一致的內容,並且根據用戶的狀態而不會有所不同。這也使得在Express中使用路由器非常容易。您的「登錄」路由器提供登錄的URL。您可以使用中間件來檢查登錄的URL,以確定您是否實際登錄,如果不是,則重定向回到未登錄頁面,反之亦然。

+0

這是正確的流程 – Yerken

+1

謝謝你,哈哈我認爲有一個很好的理由,爲什麼我沒有看到任何這樣的例子。我只是想了解中間件鏈接是如何工作的,這對我來說通常意味着做你沒有技術上應該做的事情。 – House3272

1

萬一別人運行到這個問題,這是爲我工作:

var publicR = new router(); 
publicR.get('/', function *(next) { 
    ....public.html.... 
}); 
var privateR = new router(); 
privateR.get('/', function *(next) { 
    ....private.html.... 
}); 

app.use(mySwitcher); 


function *mySwitcher(next){ 
    if(isAuthenticated) 
     yield privateR.routes().call(this,next); 
    else 
     yield publicR.routes().call(this,next); 
}