Obtendo conteúdo binário no Node.js usando request

135

Eu estava tentando GETusar dados binários requeste tinha algo como:

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

Mas bodysempre houve alguns bytes diferentes do esperado. Após uma investigação mais aprofundada, descobri que o requestsuposto bodyé string e substitui todos os bytes não unicode.

Eu tentei adicionar

encoding: 'binary'

para requestSettingsmas não ajudou.

Como posso obter os dados binários?

GilZ
fonte

Respostas:

300

OK, depois de muita pesquisa, descobri que requestSettingsdeveria ter:

encoding: null

E então bodyserá do tipo Buffer, em vez do padrão, que é string.

GilZ
fonte
50
Que pesadelo absurdo. Levei 12 horas para caçar isso. Parece que o módulo Solicitação de Nó, por padrão, trata os dados recebidos no conteúdo da resposta como UTF-8 e converte automaticamente quaisquer seqüências de bytes não UTF-8 em caracteres indesejados (mas válidos UTF-8). Nenhuma quantidade de configuração 'mimetype ", etc. funciona (não é o que se supõe para dados de resposta ). encoding: nullÉ a única opção que funciona. E - muito mal documentada. Deveria haver um aviso óbvio na documentação da solicitação de nó sobre como recuperar dados binários puros .. Obrigado!
Dan Nissenbaum
2
@StoyanBerov, fico feliz que você tenha achado essa resposta útil, mas nos 5 anos desde que escrevi essa resposta, o leia-me do pacote foi corrigido para destacar essa solução em vários lugares. Além disso, eu recomendo usar um pacote que ofereça suporte a Promessas em vez deste pacote.
GilZ 26/03
@ Gilz, obrigado pela atualização! Na verdade, eu tive a impressão de que a codificação está definida como nula por padrão. Além disso, o problema surgiu em um projeto legado, definido como uma versão de nó super antigo e retornos de chamada - apenas em qualquer lugar.
Stoyan Berov
Encontrei-o novamente - não usei isso há séculos. Codificação: nula para o resgate
Pyro
0

A resposta aceita não resolveu meu problema. De alguma forma, achei que gzip: truefuncionava.

gismatthew
fonte