Comment puis-je ungzip (décompresser) un NodeJS demande du module gzip corps de la réponse?
Comment décompresser un format gzip corps à une demande du module de la réponse?
J'ai essayé plusieurs exemples à travers le web, mais aucun d'eux ne semble fonctionner.
request(url, function(err, response, body) {
if(err) {
handleError(err)
} else {
if(response.headers['content-encoding'] == 'gzip') {
//How can I unzip the gzipped string body variable?
//For instance, this url:
//http://highsnobiety.com/2012/08/25/norse-projects-fall-2012-lookbook/
//Throws error:
//{ [Error: incorrect header check] errno: -3, code: 'Z_DATA_ERROR' }
//Yet, browser displays page fine and debugger shows its gzipped
//And unzipped by browser fine...
if(response.headers['content-encoding'] && response.headers['content-encoding'].toLowerCase().indexOf('gzip') > -1) {
var body = response.body;
zlib.gunzip(response.body, function(error, data) {
if(!error) {
response.body = data.toString();
} else {
console.log('Error unzipping:');
console.log(error);
response.body = body;
}
});
}
}
}
}
- Ne pas le navigateur de manière transparente le faire?
- J'ai ajouté de l'node.js tag, mais je reçois ce que ne précise pas... permettez-moi de modifier le post...
- vous pouvez enregistrer les données dans un fichier
req.gz
et décompressez-le en ligne de commande? Si oui, qu'est-ce que la sortie degunzip req.gz
etfile req.gz
- Salut Andrew! Merci pour la suggestion. Si j'ai enregistrer le fichier à un "req.gz" fichier, extraire sur le bureau produit un fichier nommé "req.gz.cpgz". Extacting ce fichier à son tour produit un 3ème fichier namded "req. 2.gz". Le corps de la requête a été encodé en utf8 (la réponse.setEncoding('utf8')) avant la lecture du corps. Cependant, il ne semble pas faire une différence. Je reçois le même message d'erreur et similaires de bureau, le fichier de résultats.
- demande 3.0 ajouter la prise en charge automatique pour cette fois nœud v0.10 vient de sortir
Vous devez vous connecter pour publier un commentaire.
Je ne pouvais pas obtenir la demande de travail non plus, donc fini à l'aide de http à la place.
var gunzip = gzip.createGunzip();
devrait êtrevar gunzip = zlib.createGunzip();
essayez d'ajouter
encoding: null
les options que vous avez passer àrequest
, cela permettra d'éviter la conversion de la téléchargé le corps d'une chaîne et de le conserver dans un buffer binaire.Comme @Iftah dit, définir
encoding: null
.Exemple complet (moins d'erreur de manipulation):
En fait la demande module gère le gzip réponse. Pour raconter la demande de module pour décoder le corps de l'argument dans la fonction de rappel, Nous avons à définir la "gzip" pour de vrai dans les options. Permettez-moi de vous expliquer avec un exemple.
Exemple:
Note: Les données que vous obtenez sur 'reponse' événement n'est pas décodé.
Cela fonctionne pour moi. Espérons que cela fonctionne pour vous les gars aussi.
Le problème similaire généralement que nous avons rencontré pendant le travail avec la demande de module JSON de l'analyse. Permettez-moi de l'expliquer. Si tu veux demander module pour analyser automatiquement le corps et de vous fournir le contenu JSON dans le corps de l'argument. Ensuite, vous devez définir 'json' pour de vrai dans les options.
Référence: https://www.npmjs.com/package/request#requestoptions-callback
J'ai formulé une plus réponse complète après avoir essayé les différentes façons de gunzip, et de résoudre les erreurs à voir avec l'encodage.
Espère que cela vous aide aussi:
Comme on le voit dans https://gist.github.com/miguelmota/9946206:
À la fois la demande et de la demande-la promesse de la poignée de la boîte de Dec 2017:
Voici mes deux cents. J'ai eu le même problème et trouvé une belle bibliothèque appelée
concat-stream
:.gz
fichier, pré-comprimé.Voici un exemple de travail (en utilisant le module de demande de nœud) qui gunzips la réponse
Code complet: https://gist.github.com/0xPr0xy/5002984
Avec
eu
, unrequest
alternative, vous pouvez tout simplement faire:De décompression est effectué automatiquement en cas de besoin.