2017-09-26 18 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) { ... } 
}) 

しかし、私は体内のエラーメッセージを得ることができないようです。

どうすればエラーメッセージが表示され、意味のあるログに記録され、処理が中断されますか?

答えて

0

responseイベントに渡される引数は、そのハンドラ内でパイプラインを作成することができ、同様に読めるストリームであるので:一度観察

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

関連する問題