2014-09-30 2 views
5
내가 API 서버에 웹 서버에서 프록시 요청에 다음 노드 명시 적 코드를 사용

: 이것은 단순한 어떤 동사의 요청 (GET, 게시물에 대한 잘 작동프록시 JSON 요청이 표현

app.use('/api', function(req, res) { 
    var url = 'http://my.domain.com/api' + req.url; 
    req.pipe(request(url)).pipe(res); 
}); 

, 등 ...), 그러나 'Content-type': 'application/json' 요청을 보내면 pipe 줄에 응답하지 않습니다.

json 요청에서이 노드 익스프레스 프록시 코드가 왜 멈 춥니 까?
어떻게 지원합니까?

+1

당신은 이미 요청 모든 데이터를 읽고 그 길 전에 미들웨어를 구문 분석 몸을 사용하고 있습니까? – mscdex

+0

@mscdex 저는 [각형 풀 스트레이트 생성 프로젝트] (https://www.npmjs.org/package/generator-angular-fullstack)에서 일하고 있습니다. 프로젝트가 [body-parser 패키지를 사용함] (https://github.com/DaftMonk/fullstack-demo/blob/master/server/config/express.js)을 보았으므로 대답은 아마도 예일 것입니다. – Jonathan

+1

본문 미들웨어를 파싱하기 전에 커스텀 미들웨어를 (또는 심지어 최초의 미들웨어로 만드십시오) 도움이되는지 확인하십시오. – mscdex

답변

16

사용자 정의 미들웨어 기능 this line 전에 이동해야 본문 파서보다 먼저 실행해야합니다. 이렇게하면 사용자 정의 미들웨어에서 request(url)으로의 파이프 연결을 위해 요청 데이터가 여전히 존재합니다. 교수형의

원인은 현재 req이 (몸 구문 분석 미들웨어 이미 요청 모든 데이터를 읽고 구문 분석하기 때문에) 그래서 그것이 결코 request(url) 스트림에 .end() 호출하지 request(url)에 기록 할 데이터가 없다는 것입니다. 즉, url에 대한 요청은 결코 완료되지 않는 데이터를 기다리고 있기 때문에 완료되지 않습니다. POST 요청의 경우

+0

오류가 발생하면 내 눈이 더 좋아질 것입니다. 나는 또한'body-parser'가 데이터를 구문 분석하고'req'에서 데이터를 추출하지 않기를 기대합니다. – Jonathan

+0

요청을 구문 분석하기 위해 요청 스트림에서 데이터를 읽어야합니다. 모든 요청 데이터가 일단 읽혀지면 사라집니다.streams2를 사용하면 모든 데이터를 요청 스트림으로 되돌릴 수 있을지도 모르겠다.하지만 모든 데이터를 버퍼링해야한다는 것을 의미한다. 예를 들어 누군가가 거대한 파일을 업로드하면 문제가 될 수있다. – mscdex

+0

두 가지 질문 : 1) 'body-parser'가 파싱 된 json에 대한 액세스 권한을 부여합니까? 'request (url)'로 다시 스트리밍 할 수 있습니까? 2) [노선이 특급 열차라고 부르는 이유가있을 수 있습니다.] (https://github.com/DaftMonk/fullstack-demo/blob/72cf7510244c577a0ed4d139cfa6fd4922ddd47d/server/app.js#L29) 무엇입니까? 그리고 만약 그렇다면 정말로 첫 번째 프록시를 수행 한 다음 프로세스를 수행하고 라우팅해야합니다. 로컬 처리 후 프록시가 라우팅의 일부가되어서는 안됩니까? – Jonathan

2

는 다음과 같은 구조는 작동합니다

app.post('/api/method', (req, res) => { 
    req.pipe(request.post(someUrl, { json: true, body: req.body }), { end: false }).pipe(res); 
} 

당신이 bodyparser 미들웨어를 사용하는 경우이 관련 물론이다.

+0

이것은 정확하게 내가 찾고 있었던 것이었다. 일부 JSON 게시, 익스프레스를 통한 프록시, API로부터 응답 받기. 우수한! – Richard

0

app.use('/api', function(req, res) { 
 
    var url = 'http://my.domain.com/api' + req.url; 
 
    
 
    request({ 
 
      uri: url, 
 
      method: "POST", 
 
      body: _body, 
 
      json: true 
 
     }, function (_err, _res, _resBody) { 
 
      //do somethings 
 
      res.json(_resBody); 
 
     }); 
 

 
});

+0

코드가 개선 된 이유를 설명해야합니다. –