2017-02-16 46 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/users', authenticateRoute, aclAuthenticator, userRoutes);

Мой новый маршрутизатор файл

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

Я в основном пытаются overide начального промежуточного ПО, возможно ли это?

ответ

1

Единственный способ, которым я знаю, чтобы сделать это, чтобы применить первые два промежуточные программную непосредственно к маршрутизатору, без пути префикса:

router.use(middleware1, middleware2); 

Затем, в каждом из этих промежуточных программных, проверьте путь URL и если это специальный путь, по которому вы хотите пропустить эти посредники, просто позвоните next().

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

Затем вы можете зарегистрировать свой третий промежуточное программное обеспечение только путь, который вы заинтересованы в:

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

Первые два middewares будет пропускать те, которые вы хотите, чтобы пропустить и третий только будет вызывается для вашего конкретного маршрута.

+0

Wont это делает код действительно грязным, проверки на основе маршрута создают хаос. Также это должно быть сделано с помощью регулярного выражения. Если у меня есть путь '/ user/1', это будет меняться правильно.? –

+0

@NitishPhanse - для того, что вы описали, это будет одна добавленная строка кода в два маршрута (см. Строку кода, добавленную в мой ответ). Определения маршрутов сделаны инклюзивными, а не эксклюзивными, поэтому я не знаю, как еще вы это сделаете. Более чистым способом было бы исправить ваш дизайн URL-адресов, чтобы вы не создавали эту ситуацию в первую очередь, так что middleware3 более легко отделяется от middleware1 и middleware2 (например, на целом отдельном маршрутизаторе). – 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); 

Ofcourse вы, возможно, придется изменить код, если вы используете динамический маршруты .. но это не должно быть сложно.

+0

может использовать регулярные выражения для динамических маршрутов ..? –

+0

@NitishPhanse Да, вы можете. –

+0

Также в этом случае, как вы будете цеплять middlewares, если условие не выполняется. Или эта проверка должна быть добавлена ​​в каждое промежуточное программное обеспечение. –