Obtenir du contenu binaire dans Node.js à l'aide de request

136

J'essayais d' GETutiliser des données binaires requestet j'avais quelque chose comme:

var requestSettings = {
    method: 'GET',
    url: url,
};
request(requestSettings, function(error, response, body) {
    // Use body as a binary Buffer
}

Mais bodyétait toujours quelques octets différent de prévu. Après une enquête plus approfondie, j'ai découvert que requestsupposé bodyétait une chaîne et remplacé tous les octets non-unicode.

J'ai essayé d'ajouter

encoding: 'binary'

pour , requestSettingsmais il n'a pas aidé.

Comment puis-je obtenir les données binaires?

GilZ
la source

Réponses:

301

OK, après beaucoup de fouilles, j'ai découvert que ça requestSettingsdevrait avoir:

encoding: null

Et puis bodysera de type Buffer, au lieu de la valeur par défaut, qui est une chaîne.

GilZ
la source
51
Quel cauchemar absurde. Il m'a fallu 12 heures pour le traquer. Il semble que le module Node Request, par défaut, traite les données entrantes dans le contenu de la réponse comme UTF-8 et convertit automatiquement toutes les séquences d'octets non UTF-8 en caractères indésirables (mais valides UTF-8). Aucune quantité de paramètre «mimetype», etc. ne fonctionne (pas que ce soit censé le faire pour les données de réponse ). C'est encoding: nullla seule option qui fonctionne. Et - très mal documentée. Il devrait y avoir un avertissement évident dans la documentation de la requête de nœud sur la façon dont pour récupérer des données binaires pures. Merci!
Dan Nissenbaum
2
@StoyanBerov, je suis heureux que vous ayez trouvé cette réponse utile, mais au cours des 5 années écoulées depuis que j'ai écrit cette réponse, le fichier readme du paquet a été corrigé pour mettre en évidence cette solution à plusieurs endroits. De plus, je recommande vivement d'utiliser un package prenant en charge les promesses au lieu de ce package.
GilZ
@Gilz, merci pour la mise à jour! J'avais en fait l'impression que l'encodage est défini sur null par défaut. En outre, le problème est survenu dans un projet hérité, défini sur une version de nœud très ancienne et des rappels uniquement partout.
Stoyan Berov
Ran dedans à nouveau - je n'ai pas utilisé cela depuis des lustres. Encodage: nul à la rescousse
Pyro
0

La réponse acceptée n'a pas résolu mon problème. J'ai en quelque sorte pensé que cela gzip: truefonctionnait.

Gismatthew
la source