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...});
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?
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
}
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.
Hilfreichster Kommentar
Verwenden Sie in Ihrer Anfrage grundsätzlich nicht
body: {}
. Wenn Sie Daten im Hauptteil übergeben möchten, verwenden Sie stattdessenjson: {}