2017-02-16 8 views
0

私はルータの親サフィックスとしてルート/usersを持っています。その後のすべてのルートが親を追加します。私userRoutesで/users/details明示的にミドルウェアを適用します

私app.jsで

app.use('/api/v1/users', 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を追加するための方法はありますミドルウェアを親のプレフィックス付きルートに追加した後、ある特定のルートに対しては、最初の2つではなく3つ目のミドルウェアのみが適用されるという例外があります。

例: app.use( '/ api/v1/users'、authenticateRoute、aclAuthenticator、userRoutes);

私の新しいルータファイル

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

私は基本的に最初のミドルウェアをオーバライドしようとしている、これは可能ですか?

router.use(middleware1, middleware2); 

次に、これらのミドルウェアのそれぞれに、URLのパスを確認してください。それを行うには私の知っている

答えて

1

唯一の方法はありませんパス接頭辞を使用してルータに直接最初の2つのミドルウェアを適用することですそれらのミドルウェアをスキップする特別なパスであれば、next()に電話してください。

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

次に、あなただけが興味を持っているパスのためのあなたの第三のミドルウェアを登録することができます:最初の2 middewaresは、あなたがそれらをスキップしたいものをスキップします

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

と三番目だけでしょうあなたの特定のルートが呼び出されます。

+0

これは実際にはコードが厄介なものにしますが、ルートベースのチェックでは混乱が生じます。また、それは正規表現の権利を介して行う必要があります。 '/ user/1'のパスがある場合、これは正しく変更されます。 –

+0

@NitishPhanse - あなたが記述したところでは、それは2つのルート(コードのラインを参照してください私の答えに追加してください)でコードの行を追加されます。ルート定義は包括的で排他的ではありませんので、他にどのように行うのか分かりません。より洗練された方法でURLデザインを修正し、最初にこの状況を作成しないようにすることで、ミドルウェア3とミドルウェア2(別個のルータ全体のように)をより簡単に分離できるようにします。 – jfriend00

+0

あなたの意見に完全に同意します。例外リストが増えて10のURLになったら、配列を処理する必要があるかどうかは不思議に思っていました。これを処理できるURL構造は何ですか? –

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; 

ため、サーバー/ルートでミドルウェアを無効にする方法であるファイル勿論

app.use(ExpressMiddleware); 

動的使用している場合は、コードを変更する必要がある場合がありますしかし、それは難しいことではありません。

+0

は、ダイナミックルートの正規表現を使用することができます..? –

+0

@NitishPhanseはいできます。 –

+0

この場合も、条件が満たされていない場合、どのようにミドルウェアをチェーン化しますか?または、このチェックを各ミドルウェアに追加する必要があります。 –

関連する問題