2017-10-26 11 views
2

표현의 app.get()app.use()의 차이점을 더 잘 이해하고 싶습니다.프록시에서 app.use와 app.get *의 차이 *

나는 모든 HTTP 동사에 app.use가 적용된다는 것을 알고 있습니다.

는 또한 " app.use() adds middleware rather than a route는" 나는이 사실이 동작을 일으키는 이유를 이해하고 싶습니다

...

내가 개발 웹 서버 반응 프록시에 필요 특급 API 서버를 읽었습니다 .

이것은 API 경로가 아닌 모든 경로가 프록시되어야 함을 의미합니다.

var proxy = require('express-http-proxy'); 

module.exports = function set_react_catchall_routes(app) { 
    /* Final route to send anything else to react server. */ 
    app.get('*', proxy('localhost:3000')); 
    app.post('*', proxy('localhost:3000')); 
} 

을하지만이 작업을 수행 할 때 작동하지 않습니다 :

나는,이 같은 경로를 작동 프록시 때

app.use('*', proxy('localhost:3000')); 

은 특히, "인덱스"페이지는 프록시 및 제공됩니다 이 콘텐츠는 다음과 같습니다.

<body> 
    <div id="root"></div> 
    <script type="text/javascript" src="/static/js/bundle.js"></script> 
</body> 

클라이언트는 자바 스크립트 반응 번들을 요청하지만 " g가 발생합니다 ".

아무 것도 기록되지 않아 GET 및 POST 이외의 다른 HTTP 요청이 작동하지 않는다고 합리적으로 확신합니다.

그래서 차이점은 무엇입니까? 상단에이 기록을 가하고

답변

2

시도, 그것은 무슨 일이 일어나고 있는지 명확히하는 데 도움이 될 것입니다

app.use(function(req, res, next) { 
    // req.path will be '/static/js/bundle.js' 
    console.log('path1: ' + req.path); 

    next(); 
}); 

app.use('*', function(req, res, next) { 
    // req.path will be '/' 
    console.log('path2: ' + req.path); 

    next(); 
}); 

app.all('*', function(req, res, next) { 
    // req.path will be '/static/js/bundle.js' 
    console.log('path3: ' + req.path); 

    next(); 
}); 

당신이 req.path의 일치하는 부분을 제거합니다 app.use를 사용하는 경우. 경로 (로깅 섹션 1)를 지정하지 않으면 해제되지 않습니다. 마찬가지로 섹션 3은 app.all (app.get 등은 모두 같은 방식으로 작동합니다)을 사용하고 있는데 이는 req.path을 변경하지 않습니다. 그것은 제 2 절입니다. 문제는이 예를 살펴 일어나는 이유

이해하기 :

var router = express.Router(); 

router.get('/profile', ...); 

app.use('/user', router); 

요청이 /user/profileapp.use 경로의 /user 부분을 제거합니다 온다. 까지 router 우려 경로는 단지 /profile입니다.

는 미들웨어에서 호출 http://expressjs.com/en/4x/api.html#req.path

는 마운트 지점은 req.path에 포함되지 않습니다, 워드 프로세서를 인용합니다.

app.use에 대한 호출 경로는 '시작 위치'와 약간 비슷하며 일치하는 항목은 버려집니다. 모든 것과 일치하는 *에 대해 모든 것을 버립니다.

express-http-proxy의 소스 코드를 빠르게 살펴 본다면 req.path을 사용하여 프록시 요청의 경로를 확인할 수 있습니다. 경로가없는 app.use 만 사용하면 제대로 작동합니다.

이해 app.use 유사하게 관련된 다른 요청의 호텔을 고를 수 있습니다 :

  • req.url하는 req.path에 있지만 쿼리 문자열이 포함와 유사하다. req.path과 마찬가지로 에 의해 제거 된 mountpath 섹션과 일치합니다. Express Request은 노드 http.IncomingMessageurl 속성을 상속하므로 Express 설명서에 명시 적으로 나열되어 있지 않습니다.
  • req.originalUrlreq.url과 동일하게 시작하지만 app.use은 변경되지 않습니다.
  • app.use에 의해 제거 된 경로의 섹션을 저장하는 데 사용됩니다.

req.originalUrl의 경우 the documentation을 참조하십시오.이 세 가지 속성에 대한 자세한 내용은

+0

멀리, 굉장한 대답, _ 정확한 @ 내가 알 필요가있는, 명확하게 설명! – GreenAsJade