Request: Das erste Argument muss ein Buffer-String sein

Erstellt am 16. Nov. 2015  ·  25Kommentare  ·  Quelle: request/request

Hallo, ich habe etwas Code ausgeführt und diese Fehlermeldung erhalten:

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

Komisch ist, dass wenn ich die aktuelle Version des Request-Moduls durch eine ältere ersetze (### v2.60.0 (2015/07/21), laut Changelog), alles bestens funktioniert.

Der Code, der diesen Fehler verursacht, ist dieser:

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

Hilfreichster Kommentar

Verwenden Sie in Ihrer Anfrage grundsätzlich nicht body: {} . Wenn Sie Daten im Hauptteil übergeben möchten, verwenden Sie stattdessen json: {}

Alle 25 Kommentare

Welcher Datentyp ist body ? Außerdem gibt es keine responseType Eigenschaft.

Das ist: body = new Uint8Array(request.toArrayBuffer())
Ich weiß, dass es keinen resopnseType gibt, aber das sollte keine Rolle spielen (da es funktioniert hat), oder?

Im Grunde sollte der Körper also entweder String oder Buffer , da ich mir bei diesen neuen Typen nicht sicher bin.

Nun, in hat bis jetzt funktioniert, es bedeutet also, dass es _per se_ kein Problem gab, diesen neuen eingebauten Typ zu senden (was auch immer das ist und was auch immer die Beziehung zu Buffer ist),
es wurde nur eine if-Bedingung künstlich hinzugefügt, die einen nicht benötigten Fehler auslöst.

Ich habe einige Hotfixes gefunden, die ich anwenden könnte, ich finde es nur etwas unnötig:
https://www.npmjs.com/package/uint8

Der Fehler wird vom Kern geworfen, nicht von diesem Modul. Das hängt höchstwahrscheinlich mit dem Plattform-Upgrade zusammen – falls Sie Ihre NodeJS-Version aktualisiert haben. Verwenden Sie Request im Browser? Was wäre wenn Bedingung? Was hat bis jetzt funktioniert?

Nein, dieser Fehler tritt auf, wenn ich ihn auf dem Knoten ausführe. Es ist nicht passiert, bis ich npm (gestern) aktualisiert habe.
Und als ich dann die node_modules/request mit der alten überschrieben habe, funktionierte es wieder.
Dann ist es ziemlich seltsam, dass der Fehler vom Knotenkern selbst ausgelöst wird.

Das ist seltsam idd. Ich habe in den letzten PRs zwei mögliche Verdächtige gefunden, aber ich brauche Ihren _exakten_ Code, um den Fehler zu reproduzieren - ein kleines eigenständiges Codebeispiel, das ich ausführen kann.

Wie wäre es mit diesem 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)});

Hier behoben #1905

Super, danke! :)

Hallo Leute,

Ich habe Version 2.70.0 installiert, aber ich habe immer noch mit dem gleichen Fehler zu kämpfen:

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)

Dies ist mein Code, den ich derzeit verwende:

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

Ich hoffe, mein Code und meine Frage sind klar genug.

Habe diesen Fehler auch.

@novellizator Kannst du das bitte wieder öffnen?

@banomaster @Ohar body muss String oder Buffer

@simov Oh danke.
ich benutzte

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

es gibt JSON zurück, aber ich erhalte dieses Problem (# 1904) auf dem Remoteserver.
Mit res.json() Problem beheben, bcz es JSON entkommen und es stringifizieren. Aber ich brauche JSON als Antwort und wenn ich res.json , wird mir stattdessen eine Escape-Zeichenfolge gesendet.
Können Sie mir bitte dabei helfen?

Beispiel

Handler

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

Tatsächliche Resonanz

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

Gewünschte Antwort

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

Setzen Sie die Option json auf true , sehen Sie sich auch den Abschnitt Optionen in den Dokumenten an.
Ihre letzte Frage bezieht sich nicht auf dieses Problem. Stellen Sie eine neue, wenn Sie weitere Fragen haben.

Wow, Bravo-Anfrageteam, eine Möglichkeit, die Benutzeroberfläche zu unterbrechen, ohne die Hauptversionen zu aktualisieren :/

@mboudreau können Sie ein anderes Problem eröffnen und genau erklären, was bei Ihnen nicht funktioniert?

Im Wesentlichen benutze ich request seit 2.64.x, und ich habe immer nur
ein Objekt im Body verwendet, das auf Anfrage automatisch serialisiert wurde,
aber seit der neuesten version ist dies nicht mehr der Fall. Dies im Wesentlichen
brach mehrere meiner Builds gleichzeitig ab, als die neue Version herauskam
mit einer sehr kryptischen Fehlermeldung.

Der Grund, warum ich mich ärgere, ist der semantische Versionsstandard sagt
dass bei der Einführung einer Breaking Change die Hauptversion
inkrementiert werden. Wie Sie in diesem Thread sehen können, ist die neueste Feature-Version
brach für viele und verursachte mir persönlich viel Frustration und Verschwendung
Zeit versuchen zu berechnen oder diesen Fehler.

Ich denke nicht, dass es ein eigenes Ticket verdient, aber nur eine Warnung vor dem
Änderungen vorzunehmen und sicherzustellen, dass die semantische Versionierung korrekt befolgt wird.

Am Freitag, 29. April 2016, 17:28 Uhr schrieb simo [email protected] :

@mboudreau https://github.com/mboudreau können Sie ein anderes Problem eröffnen ?
und genau erklären, was bei dir nicht funktioniert?


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/request/request/issues/1904#issuecomment -215646824

Ich bin mir immer noch nicht sicher, was das erwartete Verhalten in Ihrem Fall ist? Erwarten Sie, ein Objekt an die Option body und einen stringifizierten JSON- oder einen Abfragestring-Text zu senden?

In jedem Fall sollten Sie ein Codebeispiel bereitstellen, um den Fehler zu reproduzieren. Aus den Dokumenten:

body - Entitätskörper für PATCH-, POST- und PUT-Anfragen. Muss ein Buffer, String oder ReadStream sein. Wenn json true ist, muss body ein JSON-serialisierbares Objekt sein.

Das kannst du testen:

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

Siehe die Ergebnisse hier . Wie Sie sehen können, ist der Body ein stringifiziertes JSON-Objekt.

Hallo zusammen, ich habe eine Weile mit diesem Fehler herumgefummelt und hier ist, was ich herausgefunden habe. Wenn die Parameter der Post-Anforderung vom Typ: {form: {key: 1}} , werden die Post-Parameter automatisch serialisiert, aber wenn es etwas anderes ist, sagen wir {body: {key: 1}} , wird der Fehler new TypeError('first argument must be a string or Buffer'); ausgegeben.

Um dies zu überwinden, habe ich gerade {body: JSON.stringify({key: 1})} und die Anfrage war erfolgreich. Ich habe noch nicht in die Quelle geschaut, aber das hat bei mir funktioniert.

Wenn wir im Optionsobjekt json: true festlegen, werden die Anforderungsparameter automatisch serialisiert.

Verwenden Sie in Ihrer Anfrage grundsätzlich nicht body: {} . Wenn Sie Daten im Hauptteil übergeben möchten, verwenden Sie stattdessen json: {}

Manchmal sind die besten Antworten ganz am Ende eines Threads. Danke @itsyogesh @cozzbie

@novellizator Leute, das war ein geschlossenes Problem, aber ich bin verwirrt, da ich das für ein Binärbild mache und den gleichen Fehler erhalte:

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

Hey, bin gerade auf eine Lösung gestoßen. Ich habe einen Json body gesendet, aber ich musste ihn mit body: JSON.stringify(body) in einen String konvertieren

Ich habe ein Uint8Array als meinen Körper ohne Fehler verwendet, aber als ich eine Anfrage gesendet habe, bei der das Array die Länge Null hatte, wurde plötzlich ein Fehler ausgegeben. Wahrscheinlich ein kleiner Validierungsfehler, so oder so.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen