Request: le premier argument doit être une chaîne de Buffer

Créé le 16 nov. 2015  ·  25Commentaires  ·  Source: request/request

Salut, j'exécutais du code et j'ai eu ce message d'erreur :

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

Ce qui est amusant, c'est que si je remplace la version actuelle du module de requête par une version plus ancienne (### v2.60.0 (2015/07/21), selon le journal des modifications), tout fonctionne très bien.

Le code qui provoque cette erreur est le suivant :

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

Commentaire le plus utile

Fondamentalement, n'utilisez pas body: {} dans votre demande. Si vous souhaitez transmettre des données dans le corps, utilisez plutôt json: {}

Tous les 25 commentaires

Quel type de données est body ? De plus, il n'y a pas responseType propriété

C'est ça : body = new Uint8Array(request.toArrayBuffer())
Je sais qu'il n'y a pas de resopnseType, mais cela ne devrait pas avoir d'importance (puisque cela a fonctionné), n'est-ce pas ?

Donc, fondamentalement, le corps devrait être soit String soit Buffer , pas sûr de ces nouveaux types.

Eh bien, cela a fonctionné jusqu'à présent, cela signifie donc qu'il n'y a eu aucun problème _en soi_ avec l'envoi de ce nouveau type intégré (quel qu'il soit et quelle que soit sa relation avec Buffer),
seule une condition if a été ajoutée artificiellement pour générer une erreur inutile.

J'ai trouvé quelques correctifs que je pourrais utiliser, je les trouve juste un peu inutiles :
https://www.npmjs.com/package/uint8

L'erreur est renvoyée depuis le noyau, pas depuis ce module. C'est très probablement lié à la mise à niveau de la plate-forme - au cas où vous auriez mis à niveau votre version de NodeJS. Utilisez-vous la requête dans le navigateur ? Et si condition ? Qu'est-ce qui fonctionnait jusqu'à maintenant ?

Non, cette erreur se produit lorsque je l'exécute sur node. Cela ne s'est pas produit avant la mise à niveau de npm (hier).
Et puis, lorsque j'ai écrasé le node_modules/request avec l'ancien, il a recommencé à fonctionner.
Ensuite, il est assez étrange que l'erreur soit générée par le noyau du nœud lui-même.

C'est bizarre idd. J'ai trouvé deux suspects possibles dans les PR précédents, mais j'ai besoin de votre code _exact_ pour reproduire le bogue - un petit exemple de code autonome que je peux exécuter.

Et ce code ?

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

Corrigé ici #1905

Merci beaucoup! :)

Salut les gars,

J'ai installé la version 2.70.0, mais j'ai toujours du mal avec cette même erreur :

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)

Voici mon code que j'utilise actuellement :

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

J'espère que mon code et ma question sont assez clairs.

J'ai aussi cette erreur.

@novellizator Pouvez-vous rouvrir ceci s'il vous plaît ?

@banomaster @Ohar body doit être String ou Buffer

@simov Oh merci.
j'ai utilisé

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

il renvoie JSON, mais j'obtiens ce problème (# 1904) sur le serveur distant.
En utilisant res.json() résoudre le problème, il échappe à JSON et le chaîne. Mais j'ai besoin d'obtenir JSON en réponse et lorsque j'utilise res.json , il m'envoie une chaîne d'échappement à la place.
Pouvez-vous s'il vous plaît m'aider avec ça?

Exemple

Gestionnaire

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

Réelle réponse

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

Réponse souhaitée

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

Définissez l'option json sur true , consultez également la section des options dans la documentation.
Votre dernière question n'est pas liée à ce problème, postez-en une nouvelle si vous avez d'autres questions.

Wow, bravo request team, moyen de casser l'interface sans mettre à jour les versions majeures :/

@mboudreau pouvez-vous ouvrir un autre problème et expliquer exactement ce qui ne fonctionne pas pour vous ?

Essentiellement, j'utilise request depuis 2.64.x, et j'ai toujours juste
utilisé un objet dans le corps qui a été sérialisé automatiquement par requête,
mais depuis la dernière version, ce n'est plus le cas. Ceci essentiellement
a cassé plusieurs de mes builds en même temps quand la nouvelle version est sortie
avec un message d'erreur très cryptique.

La raison pour laquelle je suis ennuyé est à cause de la norme de version sémantique dit
que lorsqu'un changement de rupture est introduit, la version majeure doit
être incrémenté. Comme vous pouvez le voir sur ce fil, la dernière version de la fonctionnalité
cassé pour beaucoup et me causant personnellement beaucoup de frustration et de gaspillage
temps à essayer de comprendre ou cette erreur.

Je ne pense pas qu'il mérite son propre ticket, mais juste un avertissement de la
changements et de s'assurer de suivre correctement la gestion des versions sémantiques.

Le vendredi 29 avril 2016, 17h28, simo [email protected] a écrit :

@mboudreau https://github.com/mboudreau pouvez-vous ouvrir un autre problème
et expliquer exactement ce qui ne fonctionne pas pour vous?

-
Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/request/request/issues/1904#issuecomment -215646824

Je ne sais toujours pas quel est le comportement attendu dans votre cas? Vous attendez-vous à passer un objet à l'option body et à envoyer un JSON stringified ou un corps de chaîne de requête ?

Dans tous les cas, vous devez fournir un exemple de code pour reproduire le bogue. A partir de la doc :

body - corps d'entité pour les requêtes PATCH, POST et PUT. Doit être un tampon, une chaîne ou un ReadStream. Si json est vrai, alors body doit être un objet sérialisable JSON.

Tu peux tester ça :

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

Voir les résultats ici . Comme vous pouvez le voir, le corps est un objet JSON stringifié.

Salut tout le monde, je manipule cette erreur depuis un moment, et voici ce que j'ai découvert. Lorsque les paramètres de la demande de publication sont de type : {form: {key: 1}} il sérialise automatiquement les paramètres de publication, mais lorsqu'il s'agit d'autre chose, disons {body: {key: 1}} il renvoie l'erreur new TypeError('first argument must be a string or Buffer'); .

Pour surmonter cela, je viens de faire {body: JSON.stringify({key: 1})} et la demande a réussi. Je n'ai pas encore cherché la source, mais cela a fonctionné pour moi.

De plus, si nous définissons json: true dans l'objet options, il sérialise automatiquement les paramètres de la requête.

Fondamentalement, n'utilisez pas body: {} dans votre demande. Si vous souhaitez transmettre des données dans le corps, utilisez plutôt json: {}

Parfois, les meilleures réponses sont au bas d'un fil. Merci @itsyogesh @cozzbie

@novellizator les gars, c'était un problème fermé, mais je suis perplexe car je fais cela pour une image binaire et j'obtiens la même erreur:

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

Hé, je viens de trouver une solution à ce problème. J'envoyais un json body , mais je devais le convertir en chaîne avec body: JSON.stringify(body)

J'utilisais un Uint8Array comme corps sans erreur, mais lorsque j'ai envoyé une demande où le tableau avait une longueur nulle, une erreur s'est soudainement produite. Il s'agit probablement d'un bug de validation, d'une manière ou d'une autre.

Cette page vous a été utile?
0 / 5 - 0 notes