Request: el primer argumento debe ser una cadena de búfer

Creado en 16 nov. 2015  ·  25Comentarios  ·  Fuente: request/request

Hola, estaba ejecutando un código y recibí este mensaje de error:

_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)

Lo curioso es que si reemplazo la versión actual del módulo de solicitud por una anterior (### v2.60.0 (2015/07/21), según el registro de cambios), todo funciona bien.

El código que causa este error es 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...});

Comentario más útil

Básicamente, no use body: {} en su solicitud. Si desea pasar datos en el cuerpo, use json: {} lugar

Todos 25 comentarios

¿Qué tipo de datos es body ? Además, no hay propiedad responseType .

Es esto: body = new Uint8Array(request.toArrayBuffer())
Sé que no hay resopnseType, pero eso no debería importar (ya que funcionó), ¿verdad?

Entonces, básicamente, el cuerpo debería ser String o Buffer , no estoy seguro de estos nuevos tipos.

Bueno, funcionó hasta ahora, por lo que significa que no hubo ningún problema _per se_ con el envío de este nuevo tipo integrado (sea lo que sea y sea cual sea su relación con Buffer),
solo se agregó artificialmente alguna condición if que arroja un error innecesario.

Encontré algunas correcciones que podría emplear, pero las encuentro algo innecesarias:
https://www.npmjs.com/package/uint8

El error se lanza desde el núcleo, no desde este módulo. Eso probablemente esté relacionado con la actualización de la plataforma, en caso de que haya actualizado su versión de NodeJS. ¿Está utilizando la solicitud en el navegador? ¿Qué pasa si la condición? ¿Qué estaba funcionando hasta ahora?

No, este error ocurre cuando lo estoy ejecutando en node. No sucedió hasta que actualicé npm (ayer).
Y luego, cuando sobrescribí el node_modules / request con el anterior, comenzó a funcionar nuevamente.
Entonces es bastante extraño que el error se lance desde el propio núcleo del nodo.

Eso es extraño idd. Encontré dos posibles sospechosos en los PR anteriores, pero necesito su código _exact_ para reproducir el error: un pequeño ejemplo de código autónomo que puedo ejecutar.

¿Qué 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)});

Corregido aquí # 1905

¡Super, gracias! :)

Hola chicos,

Tengo la versión 2.70.0 instalada, pero todavía estoy luchando con este mismo error:

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 es mi código que utilizo actualmente:

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 mi código y mi pregunta sean lo suficientemente claros.

También tengo este error.

@novellizator ¿Puedes reabrir esto, por favor?

@banomaster @Ohar body debe ser String o Buffer

@simov Oh, gracias.
solía

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

devuelve JSON, pero obtengo este problema (# 1904) en el servidor remoto.
Usando res.json() fix problema, porque escapa JSON y lo encadena. Pero necesito obtener JSON en respuesta y cuando uso res.json , me envía una cadena de escape en su lugar.
¿Puedes ayudarme con eso?

Ejemplo

Manipulador

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

Resonse real

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

Respuesta deseada

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

Establezca la opción json en true , también eche un vistazo a la sección de opciones en los documentos.
Su última pregunta no está relacionada con este problema, publique una nueva si tiene otras preguntas.

Wow, bravo request team, forma de romper la interfaz sin actualizar las versiones principales: /

@mboudreau, ¿puedes abrir otro problema y explicar exactamente qué no funciona para ti?

Esencialmente, he estado usando request desde 2.64.xy siempre he
usó un objeto en el cuerpo que se serializó automáticamente por solicitud,
pero desde la última versión, este ya no es el caso. Esto esencialmente
rompió varias de mis compilaciones al mismo tiempo cuando salió la nueva versión
con un mensaje de error muy críptico.

La razón por la que estoy molesto es porque el estándar de control de versiones semántico dice
que cuando se introduce un cambio importante, la versión principal debe
incrementarse. Como puede ver en este hilo, la última versión de la función
se rompió para muchos y personalmente me causó mucha frustración y desperdicio
tiempo tratando de calcular o este error.

No creo que merezca su propio boleto, pero solo una advertencia del
cambios y para asegurarse de seguir el control de versiones semántico correctamente.

El viernes 29 de abril de 2016 a las 5:28 p.m., simo [email protected] escribió:

@mboudreau https://github.com/mboudreau ¿puedes abrir otro problema?
y explicar exactamente lo que no funciona para usted.

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/request/request/issues/1904#issuecomment -215646824

¿Todavía no estoy seguro de cuál es el comportamiento esperado en su caso? ¿Espera pasar un objeto a la opción body y enviar un JSON en cadena o un cuerpo de cadena de consulta?

De cualquier manera, debe proporcionar un ejemplo de código para reproducir el error. De los documentos:

body - cuerpo de la entidad para solicitudes PATCH, POST y PUT. Debe ser un búfer, una cadena o un ReadStream. Si json es verdadero, el cuerpo debe ser un objeto serializable JSON.

Puedes probar esto:

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)
  }
})

Vea los resultados aquí . Como puede ver, el cuerpo es un objeto JSON en cadena.

Hola a todos, he estado jugando con este error por un tiempo, y esto es lo que descubrí. Cuando los parámetros de solicitud de publicación son del tipo: {form: {key: 1}} , serializa automáticamente los parámetros de publicación, pero cuando es otra cosa, digamos {body: {key: 1}} , arroja el error new TypeError('first argument must be a string or Buffer'); .

Para superar esto, acabo de hacer {body: JSON.stringify({key: 1})} y la solicitud se realizó correctamente. Aún no he investigado la fuente, pero esto funcionó para mí.

Además, si configuramos json: true en el objeto de opciones, automáticamente serializa los parámetros de solicitud.

Básicamente, no use body: {} en su solicitud. Si desea pasar datos en el cuerpo, use json: {} lugar

A veces, las mejores respuestas están al final de un hilo. Gracias @itsyogesh @cozzbie

@novellizator chicos, este fue un problema cerrado, pero estoy desconcertado porque estoy haciendo eso para una imagen binaria y obtengo el mismo error:

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();
                        }
                    })
            })

Oye, acabo de encontrar una solución para esto. Estaba enviando un json body , pero necesitaba convertirlo en una cadena con body: JSON.stringify(body)

Estaba usando Uint8Array como mi cuerpo sin error, pero cuando envié una solicitud donde la matriz tenía longitud cero, de repente arrojaba un error. Probablemente haya un pequeño error de validación, de una forma u otra.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

andornaut picture andornaut  ·  4Comentarios

Guymestef picture Guymestef  ·  3Comentarios

ghost picture ghost  ·  3Comentarios

Aranir picture Aranir  ·  3Comentarios

crostine picture crostine  ·  3Comentarios