2017-09-26 17 views
0

https://github.com/request/request을 사용하여 HTTP 요청을 만들고 있는데 JSON을 받고 싶습니다. 응답은 심각하게 커질 것이므로 응답을 처리하기 위해 스트림 접근 방식을 사용하려고합니다. 그러나, 내가 호출하는 API는 status> = 400에 대해 'text/plain'을 반환하는데, 이는 내 JSONStream이 bork라는 것을 의미합니다. 코드 :스트림 된 node.js 처리 상태> = 400 HTTP 클라이언트

req = request.get({url: data_url}); 
    req.pipe(require('JSONStream').parse([true])) 
    .pipe(require('stream-batch')({maxItems: 1000})) 
    .on('data', callback) 
    .on('end', done); 

오류 :

Invalid JSON (Unexpected "I" at position 0 in state STOP) 

("A", "내부 서버 오류"에있다.)이 요청이 req.on('error', (err) => ...)가되지 않도록 추가 완료된 요청에 대해 '오류'이벤트를 방출하지 않는 것 같다 방아쇠. 내가 추가 할 수있다

req.on('response', function(res) { 
    if(res.statusCode >= 400) { ... } 
}) 

그러나 그때 나는 신체의 오류 메시지를 얻을 수 없을 것 같습니다.

어떻게 오류 메시지가 나타나면 의미있는 로그를 기록하고 처리를 중단 할 수 있습니까? response 이벤트에 전달되는 인수뿐만 아니라 읽을 수있는 스트림을하기 때문에

답변

0

, 당신은 핸들러 내부에 파이프 라인을 만들 수 있습니다

req.on('response', function(res) { 
    if (res.statusCode >= 400) { 
    let chunks = []; 
    res.on('data', c => chunks.push(c)) 
     .on('end',() => { 
     console.log('error', Buffer.concat(chunks).toString()); 
     }); 
    } else { 
    res.pipe(require('JSONStream').parse([true])) 
     .pipe(require('stream-batch')({maxItems: 1000})) 
     .on('data', callback) 
     .on('end', done); 
    } 
}) 
+0

우우는, 한때 명백한 관찰! 고마워. – Bittrance