Request: o primeiro argumento deve ser uma string de Buffer

Criado em 16 nov. 2015  ·  25Comentários  ·  Fonte: request/request

Olá, estava executando um código e recebi esta mensagem de erro:

_http_outgoing.js:441
    throw new TypeError('first argument must be a string or Buffer');
    ^

TypeError: first argument must be a string or Buffer
    at ClientRequest.OutgoingMessage.write (_http_outgoing.js:441:11)
    at Request.write (/Users/tomasnovella/workspace/kitt/kitt-chrome-sync/node_modules/request/request.js:1392:25)
    at end (/Users/tomasnovella/workspace/kitt/kitt-chrome-sync/node_modules/request/request.js:550:16)
    at Immediate._onImmediate (/Users/tomasnovella/workspace/kitt/kitt-chrome-sync/node_modules/request/request.js:578:7)
    at processImmediate [as _immediateCallback] (timers.js:383:17)

O engraçado é que, se eu substituir a versão atual do módulo de solicitação por uma mais antiga (### v2.60.0 (2015/07/21), de acordo com o changelog), tudo funcionará bem.

O código que causa esse erro é este:

  request.post({
        url: '<someURL>',
        qs: {
          'client': 'Google+Chrome',
          'client_id': config.clientId
        },
        headers: {
          'Content-Type': 'application/octet-stream',
          'Authorization': 'Bearer '+ accessToken
        },
        encoding: null, //  if you expect binary data
        responseType: 'buffer', 
        body: body
    }, (error, response, body) => {..blah...});

Comentários muito úteis

Basicamente, não use body: {} em sua solicitação. Se você quiser passar dados no corpo, use json: {} vez disso

Todos 25 comentários

Que tipo de dados é body ? Além disso, não há propriedade responseType .

É o seguinte: body = new Uint8Array(request.toArrayBuffer())
Eu sei que não há resopnseType, mas isso não deveria importar (já que funcionou), certo?

Então, basicamente o corpo deve ser String ou Buffer , não tenho certeza sobre esses novos tipos.

Bem, funcionou até agora, então significa que não houve problema _per se_ em enviar este novo tipo integrado (seja o que for e seja qual for a sua relação com o Buffer),
apenas alguma condição if foi adicionada artificialmente, o que gera um erro não gerado.

Encontrei alguns hotfixes que poderia empregar, mas acho que são um pouco desnecessários:
https://www.npmjs.com/package/uint8

O erro é lançado do núcleo, não deste módulo. Isso provavelmente está relacionado à atualização da plataforma - no caso de você atualizar sua versão do NodeJS. Você está usando solicitação no navegador? E se condição? O que estava funcionando até agora?

Não, esse erro ocorre quando estou executando no nó. Isso não aconteceu até que eu atualizei o npm (ontem).
E então, quando eu sobrescrevi o node_modules / request com o antigo, ele começou a funcionar novamente.
Então é muito estranho que o erro seja lançado do próprio núcleo do nó.

Isso é estranho idd. Encontrei dois possíveis suspeitos nos PRs anteriores, mas preciso do seu código _exato_ para reproduzir o bug - um pequeno exemplo de código autocontido que posso executar.

Que tal este código?

var request = require('request');
request.post({
        url: 'https://clients4.google.com/chrome-sync/command',
        qs: {
          'client': 'Google+Chrome',
           'client_id': '12345'
        },
        headers: {
          'Content-Type': 'application/octet-stream',
          'Authorization': 'Bearer 123'
        },
        encoding: null, //  if you expect binary data
        responseType: 'buffer',
        body: new Uint8Array(3)
      }, function(e,r,b){console.log(e,r,b)});

Fixo aqui # 1905

Super, obrigado! :)

Ei pessoal,

Eu tenho a versão 2.70.0 instalada, mas ainda estou lutando com este mesmo erro:

TypeError: first argument must be a string or Buffer
    at ServerResponse.OutgoingMessage.end (_http_outgoing.js:524:11)
    at /Users/urbanmarovt/Documents/Faks/BCH/Diploma/PoC/gateway/routes/index.js:87:17
    at Request._callback (/Users/urbanmarovt/Documents/Faks/BCH/Diploma/PoC/gateway/routes/proxy.js:81:7)
    at Request.self.callback (/Users/urbanmarovt/Documents/Faks/BCH/Diploma/PoC/gateway/node_modules/request/request.js:200:22)

Este é o meu código que uso atualmente:

var options = {
      url: url,
      path: req.path,
      qs: req.query,
      method: req.method,
      headers: headers,
      responseType: 'buffer',
      timeout: TIMEOUT
    };

 options.json = true;
 options.body = {
        "firstName": "Test1",
        "lastName": "Test2",
        "email": "[email protected]",
        "mobilePhone": "+38631288288"
 };

 request(options, function (error, response, body) {
      callback(error, response, body, options);
    });

Espero que meu código e minha pergunta sejam claros o suficiente.

Também recebi este erro.

@novellizator Você pode reabrir isso, por favor?

@banomaster @Ohar body deve ser String ou Buffer

@simov Oh, obrigado.
eu usei

res.write(data);
res.end();

ele retorna JSON, mas recebo este problema (# 1904) no servidor remoto.
Usando res.json() fix problem, bcz escapa JSON e stringifica-o. Mas preciso obter JSON em resposta e quando uso res.json , ele me envia uma string de escape.
Você pode me ajudar com isso?

Exemplo

Handler

function foo (req, res) {
  request.post(
    'https://example.com/api',
    {form: data},
    function (error, response, body) {
      res.json(body);
    }
  );
}

Ressonância real

"{\"response\":{\"data\":{}},\"status\":0}"

Resposta desejada

{
    "response": {
        "data": {}
    },
    "status": 0
}

Defina a opção json como true , também dê uma olhada na seção de opções nos documentos.
Sua última pergunta não está relacionada a este problema, poste uma nova se você tiver outras perguntas.

Uau, equipe de solicitação bravo, maneira de quebrar a interface sem atualizar as versões principais: /

@mboudreau você pode abrir outro problema e explicar exatamente o que não está funcionando para você?

Basicamente, tenho usado a solicitação desde 2.64.x, e sempre apenas
usou um objeto no corpo que foi serializado automaticamente por solicitação,
mas desde a última versão, este não é mais o caso. Isto essencialmente
quebrou várias das minhas compilações ao mesmo tempo quando a nova versão saiu
com uma mensagem de erro muito enigmática.

A razão pela qual estou aborrecido é porque o padrão de controle de versão semântico diz
que quando uma mudança significativa está sendo introduzida, a versão principal precisa
ser incrementado. Como você pode ver neste tópico, a versão mais recente do recurso
quebrou para muitos e pessoalmente me causando muita frustração e desperdício
tempo tentando descobrir ou este erro.

Eu não acho que ele merece seu próprio ingresso, mas apenas um aviso do
alterações e certifique-se de seguir o controle de versão semântico corretamente.

Na sexta-feira, 29 de abril de 2016, 17:28 simo [email protected] escreveu:

@mboudreau https://github.com/mboudreau você pode abrir outro problema
e explicar exatamente o que não está funcionando para você?

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/request/request/issues/1904#issuecomment -215646824

Ainda não tenho certeza de qual é o comportamento esperado no seu caso? Você espera passar um objeto para a opção body e enviar um JSON stringificado ou um corpo de querystring?

De qualquer forma, você deve fornecer um exemplo de código para reproduzir o bug. Dos documentos:

body - corpo da entidade para solicitações PATCH, POST e PUT. Deve ser um Buffer, String ou ReadStream. Se json for verdadeiro, o corpo deve ser um objeto serializável JSON.

Você pode testar isso:

request({
  method: 'POST',
  url: 'http://requestb.in/tr4jaxtr',
  body: {a: 1},
  json: true,
  callback: (err, res, body) => {
    if (err) {
      console.log(err)
    }
    console.log(body)
  }
})

Veja os resultados aqui . Como você pode ver, o corpo é um objeto JSON stringificado.

Olá a todos, estou mexendo nesse erro há algum tempo e aqui está o que descobri. Quando os parâmetros de solicitação de postagem são do tipo: {form: {key: 1}} ele serializa automaticamente os parâmetros de postagem, mas quando for outra coisa, digamos {body: {key: 1}} ele lança o erro new TypeError('first argument must be a string or Buffer'); .

Para superar isso, acabei de fazer {body: JSON.stringify({key: 1})} e a solicitação foi bem-sucedida. Ainda não investiguei a fonte, mas funcionou para mim.

Além disso, se definirmos json: true no objeto de opções, ele serializa automaticamente os parâmetros de solicitação.

Basicamente, não use body: {} em sua solicitação. Se você quiser passar dados no corpo, use json: {} vez disso

Às vezes, as melhores respostas estão no fundo de uma discussão. Obrigado @itsyogesh @cozzbie

@novellizator pessoal, este era um problema fechado, mas estou confuso, pois estou fazendo isso para uma imagem binária e recebo o mesmo erro:

app.post(self._options.baseUrl + '/image.post', function (req, res) {

                delete req.headers.host;

                var headers= req.headers;
                headers['Content-Type'] = 'application/octet-stream';

                request.post('http://localhost:9080/image.post',
                    {
                        headers: headers,
                        encoding: null, //  if you expect binary data
                        responseType: 'buffer',
                        body: req.body
                    },
                    function (error, response, body) {
                        if (!error && response.statusCode == 200) {
                            res.send(body);
                            res.end();
                        } else {
                            res.send({ error: new Error('image error') });
                            res.end();
                        }
                    })
            })

Ei, acabei de encontrar uma solução para isso. Eu estava enviando um json body , mas precisava convertê-lo em string com body: JSON.stringify(body)

Eu estava usando Uint8Array como meu corpo sem erros, mas quando enviei uma solicitação em que a matriz tinha comprimento zero, de repente estava gerando um erro. Provavelmente um bug de validação, de uma forma ou de outra.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

crostine picture crostine  ·  3Comentários

mlegenhausen picture mlegenhausen  ·  4Comentários

jdarling picture jdarling  ·  3Comentários

chenby picture chenby  ·  3Comentários

ghost picture ghost  ·  3Comentários