Obtener contenido binario en Node.js usando request

136

Estaba tratando de GETusar datos binarios requesty tenía algo como:

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

Pero bodysiempre fue unos pocos bytes diferentes de lo esperado. Después de una investigación adicional descubrí que se requestsupone que bodyes una cadena y reemplacé todos los bytes no unicode.

Traté de agregar

encoding: 'binary'

a requestSettingspero no sirvió de nada.

¿Cómo puedo obtener los datos binarios?

GilZ
fuente

Respuestas:

301

OK, después de mucho cavar, descubrí que requestSettingsdebería haber:

encoding: null

Y luego bodyserá de tipo Buffer, en lugar del predeterminado, que es una cadena.

GilZ
fuente
51
Qué pesadilla absurda. Me tomó 12 horas para cazar esto. Parece que el módulo de solicitud de nodo, por defecto, trata los datos entrantes en el contenido de la respuesta como UTF-8, y convierte automáticamente cualquier secuencia de bytes que no sea UTF-8 en caracteres basura (pero UTF-8 válidos). Ninguna cantidad de configuración 'mimetype ", etc. funciona (no es que se suponga que responda) datos de ). Esta encoding: nulles la única opción que funciona. Y, muy poco documentada. Debería haber una advertencia obvia en la documentación de Solicitud de Nodo sobre cómo para recuperar datos binarios puros ¡Gracias!
Dan Nissenbaum
2
@StoyanBerov, me alegra que haya encontrado útil esta respuesta, pero en los 5 años desde que escribí esta respuesta, el archivo Léame se corrigió para resaltar esta solución en varios lugares. Además, recomiendo utilizar un paquete que admita Promesas en lugar de este paquete.
GilZ
@Gilz, gracias por la actualización! De hecho, tenía la impresión de que la codificación está configurada como nula de forma predeterminada. Además, el problema surgió en un proyecto heredado, configurado en una versión de nodo súper antigua y devoluciones de llamada, solo en todas partes.
Stoyan Berov
Me encontré con él de nuevo, no he usado esto en años Codificación: nulo al rescate
Pyro
0

La respuesta aceptada no resolvió mi problema. De alguna manera pensé que eso gzip: truefuncionó.

gismatthew
fuente