2014-01-21 5 views
20

요청 쿼리 매개 변수를 기반으로 사용할 미들웨어를 결정하려고합니다. 주요 모듈 조건부로 요청 매개 변수에 따라 미들웨어 사용

나는 이런 식으로 뭔가를 가지고 :

app.use(function(req, res){ 
    if (req.query.something) { 
    // pass req, res to middleware_a 
    } else { 
    // pass req, res to middleware_b 
    } 
}); 

middleware_amiddleware_b 자체가 express() 기능에 의해 생성 된 응용 프로그램 정기적하지 미들웨어 기능 (function(req, res, next))

둘 표현

수 없어 그것을 할 방법을 찾는다

+0

코드에 어떤 문제가 있습니까? 익스프레스 관리자로서, 이것이 내가 당신에게 이것을 제안하는 방법입니다. –

+0

@JonathanOng 문제는'middleware_a'와'middleware_b'는 정규 표현식이 아닌'express()'에 의해 생성 된 객체이기 때문에 req, res를 전달할 수 없다는 것입니다. – Michael

+1

express apps 그들 자신은 미들웨어이다. 그래 넌 할수있어. –

답변

7

나는 미들웨어를 사용하지 않을 것이다. 대신에 미들웨어 A와 B가 whatev를 확인한다. 어 : 당신은 아마 트릭 누락과 같은 미들웨어 B와

//Middleware A 
app.use(function(req, res){ 

    // If it doesn't match our condition then send to next middleware 
    if (!req.query.something) { 
    next(); 
    } else { 
    // We're good - let this middleware do it's thing 
    ... 
    next(); 
    } 
}); 

같은

//Middleware B 
app.use(function(req, res){ 

    if (req.query.something) { 
    ... 
}); 
1

보인다. 각 미들웨어는 요청 처리기입니다. 첫 번째 요청 처리기를보고 시작한 다음 다음 요청 처리기를 살펴보고 다음 요청 처리기를 살펴 봅니다. 나는 이런 식으로 뭔가에 코드를 수정하도록 제안

function myFunMiddleware(request, response, next) { 
// Do stuff with the request and response. 
// When we're all done, call next() to defer to the next middleware. 
next(); 
} 

:

는 다음과 같은 미들웨어는 기본적으로 모습입니다.
app.use(function(request, response, next) { 
    if (request.url == "/") { 
    response.writeHead(200, { "Content-Type": "text/plain" }); 
    response.end(".. Any custom msg..\n"); 
// The middleware stops here. 
    } 
    else { 
    next(); 
}}); 

tutorial을 통해하는 방법하시기 바랍니다

, 난 당신이 미들웨어를 사용하는 좋은 개요를 얻을 것이다 확신합니다. 행복한 코딩을하십시오.

16

connect/express 'middleware'에 관해서는 별다른 매력이 없습니다. 단지 함수 일 뿐이며 다른 함수를 호출 할 때 호출 할 수 있습니다. 그래서 예에서

: 말했다

app.use(function(req, res, next){ 
    if (req.query.something) { 
    middlewareA(req, res, next); 
    } else { 
    middlewareB(req, res, next); 
    } 
}); 

, 계층 적 표현 응용 프로그램을 구성하는 더 우아한 방법이있을 수 있습니다. 체크 아웃 TJ's video

+0

을 게시 할 수 있습니까? 내 응용 프로그램은 TJ의 비디오처럼 구축됩니다. 그래서 middleware_a와 middleware_b는 실제로는 객체이며 함수가 아닙니다. 그래서 나는 그들에게'req, res, next'를 전달할 수 없습니다. 익스프레스는이 둘을 구별하고 둘 중 하나를 미들웨어로 전달할 때이 두 가지를 처리 ​​할 것을 알고 있습니다. – Michael

4

이 문제는 오래되었지만 해결책을 공유하고 싶습니다. 콜백 기능이있는 미들웨어를 반환하는 함수를 작성하여이 문제를 해결했습니다.

예 미들웨어 :

function isAdminUser(callback){ 
    return function(req, res, next){ 
     var userId = callback(req); 
     // do something with the userID 
     next(); 
    } 
} 

그런 다음 당신이 명시 라우터 개체

app.use(isAdminUser(function(res){ 
    return res.body.userId 
    }); 
+0

이것은 우아한 방법입니다. 더 나은 방법을 찾지 못하면 사용하는 것이 좋습니다. –

1

나는이 스레드 조금 늦게 나는 알고 있지만이 플러그인을 사용할 수 있습니다에서 다음을 수행 할 수 있습니다 Express Conditional Tree Middleware .

여러 비동기 미들웨어를 결합 할 수 있습니다. 특히 미들웨어 (middleware_a, middleware_b)를 나타내는 두 클래스를 만들고 해당 클래스에있는 applyMiddleware 메서드 내에서 미들웨어 함수 또는 사용자 정의 해결 약속에 의해 생성 된 약속을 반환합니다. 다시.

그런 다음 기본 js 파일에서 필요에 따라 체인저를 만들어 조건부로 해당 미들웨어를 결합 할 수 있습니다! 자세한 정보는 문서를 확인하십시오. 코드를 확인한 후에 더 명확해질 것입니다.

+1

이제는 적절한 대답처럼 보입니다. . 나는 내 깃발을 되돌아보고 내 (지금은 관련성이없는) 의견을 삭제했습니다. – g00glen00b

+0

완벽! 나를 다시 알게 해줘서 고마워, 난 꽤 여기에 새로운 :) – DevForce

관련 문제