2017-02-16 70 views
0

我有一個路由/users作爲我的路由器中的父後綴,所有後續的路由將附加父母,例如。 /users/details有選擇地應用中間件的快遞

在我app.js

app.use('/api/v1/users', userRoutes); 

在我userRoutes

import express from 'express'; 
import users from '../controllers/user_controller'; 

import { authenticateRoute, authenticateSignedRoute, aclAuthenticator } from './../middlewares/AuthenticationMiddleware'; 

const router = express.Router(); 


//user routes 
router.get('/details', authenticateRoute, aclAuthenticator, users.getDetails); 
router.get('/posts', authenticateRoute, aclAuthenticator, users.getPosts); 


module.exports = router; 

什麼,我想這樣做

有沒有辦法爲我添加authenticateRoute和aclAuthenticator中間件添加到父前綴路由,然後對於一個特定的路由,只有第三個中間件被應用,而不是前兩個。

對於例如 app.use('/ API/V1 /用戶,authenticateRoute,aclAuthenticator,userRoutes);

我的新的路由器文件

router.get('/details', applyOnlyThisMiddleWare, users.getDetails); 
router.get('/posts', No MiddleWareAtAll, users.getPosts); 

基本上,我想在此改變最初的中間件,這可能嗎?

回答

1

我知道做到這一點的唯一方法是前兩種中間件直接與沒有路徑前綴適用於您的路由器:

router.use(middleware1, middleware2); 

然後,在每個那些中間件的,查詢的網址路徑如果這是您想要跳過這些中間件的特殊路徑,那麼請致電next()

if (req.path.indexOf("/somepath") === 0) { return next() }; 

然後,您可以只對你有興趣的路徑註冊您的第三中間件:

router.use("/somepath", middleware3); 

前兩個middewares會跳過你希望他們跳過那些和第三個唯一會得到你的具體路線。

+0

不會讓代碼變得非常混亂,基於路由的檢查會造成混亂。也必須通過正則表達式來完成。如果我有一個路徑'/ user/1',這將保持正確的變化。 –

+0

@NitishPhanse - 對於你所描述的,它將成爲兩條路線中的一行代碼(參見添加到我的答案中的代碼行)。路線定義被認爲是包容性的,而不是排他性的,所以我不知道你會怎麼做。一個更簡潔的方法是修復你的URL設計,以免你首先創建這種情況,以便中間件3更容易與中間件1和中間件2分離(就像在一個單獨的路由器上一樣)。 – jfriend00

+0

完全同意你的觀點。我只是想知道是否異常列表增長說,10個網址,然後我將不得不處理一個數組。你提出什麼網址結構可以解決這個問題? –

0

這是怎麼了我明確禁用中間件特定路由

'use strict'; 

const ExpressMiddleware = (req, res, next) => { 

    // dont run the middleware if the url is present in this array 
    const ignored_routes = [ 
     '/posts', 
     '/random-url', 
    ]; 

    // here i am checking for request method as well, you can choose to remove this 
    // if(! ignored_routes.includes(req.path)) { 
    if(req.method === 'GET' && ! ignored_routes.includes(req.path)) { 
     // do what you gotta do. 
     // next(); 
    } 
    else { 
     next(); 
    } 

} 


export default ExpressMiddleware; 

而在你的服務器/ routes文件

app.use(ExpressMiddleware); 

Ofcourse,您可能需要更改代碼,如果你使用動態路線..但這應該不難。

+0

可以正確使用regexes進行動態路由..? –

+0

@NitishPhanse是的,你可以。 –

+0

同樣在這種情況下,如果條件不符合,您將如何鏈接中間件。或者應該在每個中間件中添加此檢查 –