2017-02-16 3 views
0

라우터에 부모 접미어로 /users 경로가 있습니다. 이후의 모든 경로는 부모를 추가합니다 (예 : 내 app.js에서 /users/details명시 적으로 미들웨어를 적용합니다

내 userRoutes에서

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을 추가 할 수있는 방법이 있나요 미들웨어를 상위 접두사 경로에 연결 한 다음 하나의 특정 경로에 대해 예외가 발생하면 세 번째 미들웨어 만 적용되고 처음 두 개는 적용되지 않습니다.

예 : app.use ('/ api/v1/users', authenticateRoute, aclAuthenticator, userRoutes);

나의 새로운 라우터 파일

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

나는 기본적으로 초기 미들웨어를 오버라이드 (override)하는 것을 시도하고,이 가능할까요? 이러한 미들웨어의 각,

router.use(middleware1, middleware2); 

그런 다음 URL의 경로를 확인 :

답변

1

내가 그렇게 알고있는 유일한 방법은 어떤 경로 접두어로 라우터에 직접 처음 두 미들웨어를 적용하는 것입니다 그 미들웨어를 건너 뛰고 싶은 특별한 경로라면 next()으로 전화하십시오.

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

다음, 당신은 당신이에 관심이있는 경로를 세 번째 미들웨어를 등록 할 수 있습니다 : 처음 두 middewares는 당신이 그 (것)들을 생략 할 사람을 건너 뜁니다

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

세번째 유일한 것 귀하의 특정 경로를 호출하십시오.

+0

이 코드로 인해 코드가 엉망이됩니다. 경로 기반 검사는 혼란을 일으 킵니다. 또한 정규 표현식을 통해 수행되어야합니다. 만약 내가'/ user/1' 경로를 가지고 있다면 이것은 계속 바뀌어 질 것입니다. –

+0

@NitishPhanse - 당신이 묘사 한 것을 위해, 그것은 두 개의 경로에 하나의 코드 라인이 추가 될 것입니다. 경로 정의는 배타적이지 않고 포괄적 이도록 만들어져 있으므로 어떻게 할 것인지 다른 방법을 모르겠습니다. 주변 환경을보다 깔끔하게 정리하면 URL 디자인을 수정하여 처음에는이 상황을 만들지 않아도되므로 미들웨어 3은 미들웨어 1과 미들웨어 2 (예 : 전체 라우터 에서처럼)에서 쉽게 분리 할 수 ​​있습니다. – jfriend00

+0

귀하의 주장에 완전히 동의하십시오. 예외 목록이 늘어나서 10 개의 URL을 처리하면 배열을 처리해야하는지 궁금합니다. 이 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

이 경우에도 조건이 충족되지 않으면 미들웨어를 체인화하는 방법은 무엇입니까? 또는이 체크가 각 미들웨어에 추가되어야합니까? –