nodejs - Comment promettre http.request? rejeter a été appelé deux fois
Je suis d'essayer d'envelopper http.request
en Promise
:
new Promise(function(resolve, reject) {
var req = http.request({
host: '127.0.0.1',
port: 4000,
method: 'GET',
path: '/api/v1/service'
}, function(res) {
if (res.statusCode < 200 || res.statusCode >= 300) {
//First reject
reject(new Error('statusCode=' + res.statusCode));
return;
}
var body = [];
res.on('data', function(chunk) {
body.push(chunk);
});
res.on('end', function() {
try {
body = JSON.parse(Buffer.concat(body).toString());
} catch(e) {
reject(e);
return;
}
resolve(body);
});
});
req.on('error', function(err) {
//Second reject
reject(err);
});
req.write('test');
}).then(function(data) {
console.log(data);
}).catch(function(err) {
console.log(err);
});
Si j'obtiens errornous statusCode
de serveur distant, il va appeler Première rejeter et après un peu de temps Deuxième rejeter. Comment faire correctement de sorte qu'il appelle seulement d'une seule rejeter (je pense que Première rejeter est appropriée dans ce cas)? Je pense que j'ai besoin de fermer res
moi-même, mais il n'y a pas de close()
méthode sur ClientResponse
objet.
UPD:
Deuxième rejeter déclenche que très rarement - pourquoi?
source d'informationauteur happy_marmoset
Vous devez vous connecter pour publier un commentaire.
Votre code est presque bien. De réaffirmer un peu, tu veux une fonction qui encapsule le protocole http.demande avec ce formulaire:
Remarquer l'ajout de
params
etpostData
donc cela peut être utilisé comme un objectif général de la demande. Et avis la dernière lignereq.end()
-- qui doit toujours être appelé -- était absent de l'OP code.L'application de ces quelques changements à l'OP code...
Ce n'est pas testée, mais devrait fonctionner...
Et ces promesses peuvent être enchaînés, trop...
Il est plus facile pour vous d'utiliser bluebird api, vous pouvez promisify demande de module et d'utiliser la fonction de demande asynchrone comme une promesse elle-même, ou vous avez la possibilité d'utiliser le module demande-la promessequi vous rend à ne pas travailler à la création d'une promesse, mais en utilisant un objet déjà encapsule le module à l'aide de la promesse, voici un exemple: