2017-09-26 6 views
0

Je fais une requête HTTP en utilisant https://github.com/request/request et je veux recevoir JSON. La réponse sera très importante, donc je veux utiliser une approche de flux pour traiter la réponse. Cependant, l'API que j'appelle retourne 'text/plain' pour l'état> = 400, ce qui signifie que mon JSONStream va bork. Code:Statut de traitement> = 400 dans streamed node.js request Client 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); 

Erreur:

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

(« A » comme dans « Erreur interne du serveur ».) Il semble demande n'émet pas d'événements « d'erreur » pour les demandes qui complète ainsi l'ajout de req.on('error', (err) => ...) ne le fait pas déclencheur. Je pourrais ajouter

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

Mais alors je ne semble pas être en mesure d'obtenir le message d'erreur dans le corps.

Comment puis-je obtenir le message d'erreur, me connecter correctement et interrompre le traitement?

Répondre

0

Depuis l'argument passé à l'événement response est un flux lisible aussi bien, vous pouvez créer le pipeline dans son gestionnaire:

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

Ooo, une fois observé, si évident! THX. – Bittrance