2013-09-03 3 views
17

app.use과 함께 추가 된 미들웨어를 스택에서 제거 할 수있는 표준 방법이 있습니까? 그것은 should be possible to just modify the app.stack array directly 인 것으로 보이지만 내가 먼저 고려해야 할 문서화 된 방법이 있는지 궁금합니다.Express 스택에서 미들웨어를 제거하는 올바른 방법은 무엇입니까?

+0

* 적절한 방법은 원치 않는 미들웨어를 추가하는 것이 아닙니다. – elmigranto

+0

@elmigranto 그건 지나치게 단순한 견해입니다. Express Routing을보다 동적 인 방법으로 사용하고자하는 이유가 많이 있습니다. 특정 경우에 미들웨어를 추가/제거해야 할 수도 있습니다. – Brad

+0

middlewares 스택이 app._router.stack에 있습니다. – rocketspacer

답변

17

use은 실제로 Connect (Express가 아닌) 및 all it really does is push the middleware function onto the app's stack에서 제공됩니다.

그래서 배열의 함수를 잘 연결해야합니다.

그러나 app.stack에 관한 문서가 없으며 미들웨어를 제거 할 수있는 기능이 없다는 것을 명심하십시오. 향후 버전의 Connect가 코드와 호환되지 않는 변경을 할 위험이 있습니다.

+3

또는 'express'가 코드와 호환되지 않습니다. 'express '는 더 이상'connect'에 의존하지 않으므로 더 이상 작동하지 않는다고 생각합니다. – trysis

2

그렇게 할 수있는 방법은 없지만 작은 트릭으로 동일한 결과를 얻을 수 있습니다. 자신 만의 미들웨어 배열 (dynamicMiddleware라고 부르 자)을 만들지 만 표현에 밀어 넣지 말고 dynamicMiddleware에있는 모든 처리기를 비동기 적으로 순서대로 실행하는 미들웨어 하나만 밀어 넣으십시오. 배열을 통해 그 의지 루프를 한 미들웨어의 모든 동적 핸들러의 배열을 포장 : 나는 지금 그것을 테스트 할 수있는 기회가 없지만, 아이디어가 명확해야으로

const async = require('async') 

// Middleware 
const m1 = (req, res, next) => { 
    // do something here 
    next(); 
} 

const m2 = (req, res, next) => { 
    // do something here 
    next(); 
} 

const m3 = (req, res, next) => { 
    // do something here 
    next(); 
} 

let dynamicMiddleware = [m1, m2, m3] 

app.use((req, res, next) => { 
    // execute async handlers one by one 
    async.eachSeries(
     // array to iterate over 
     dynamicMiddleware, 
     // iteration function 
     (handler, callback) => { 
      // call handler with req, res, and callback as next 
      handler(req, res, callback) 
     }, 
     // final callback 
     (err) => { 
      if(err) { 
      // handle error as needed 

      } else { 
       // call next middleware 
       next() 
      } 
     } 
    ); 
}) 

코드는 약간 거친입니다. 배열에 핸들러를 추가하거나 제거하면 배열에 남아있는 핸들러 만 호출됩니다.

+0

이것이 반드시 문제를 해결하는 것은 아닙니다. 적어도 나의 경우에는 마운트 지점과 방법을 다르게 처리하는 것이 중요합니다. 내부 스택을 수정하는 것이 여전히 가능할 것으로 보이며, 조금 움직였습니다. – Brad

+0

유스 케이스를 자세히 설명해 주시겠습니까? 아마도 이것을 작은 모듈로 포장하고 다른 장착 지점에서 재사용 할 수 있습니까? – Gaafar

-1

내가 아는 한 미들웨어를 제거 할 방법이 없습니다. 그러나 원하는 언제든지 미들웨어를 '비활성화'하기 위해 부울 플래그를 할당 할 수 있습니다.

var middlewareA_isActivate = true; 
//Your middleware code 
function(req, res, next) { 
    if (!middlewareA_isActivate) next(); 
    //......... 
} 
//Deactivate middleware 
middlewareA_isActivate = false; 

이 편집 :
ExpressJs (4.x의) 코드를 읽은 후, 난 당신이 미들웨어는 app._router.stack를 통해 스택에 액세스 할 수 있는지 알, 조작 같아요 거기에서 간다. 그래도이 트릭은 장래에 작동하지 않을 수도 있습니다.
P/s : Express가 미들웨어 스택을 직접 조작 할 때 Express가 어떻게 동작하는지 테스트하지 않았습니다.

관련 문제