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...});
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?
function foo (req, res) {
request.post(
'https://example.com/api',
{form: data},
function (error, response, body) {
res.json(body);
}
);
}
"{\"response\":{\"data\":{}},\"status\":0}"
{
"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.
Comentários muito úteis
Basicamente, não use
body: {}
em sua solicitação. Se você quiser passar dados no corpo, usejson: {}
vez disso