Ich habe den folgenden Node.js-Code:
var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());
app.post('/', function(request, response) {
response.write(request.body.user);
response.end();
});
Nun, wenn ich etwas poste wie:
curl -d user=Someone -H Accept:application/json --url http://localhost:5000
Ich bekomme Someone
wie erwartet. Was ist nun, wenn ich den vollständigen Anfragetext erhalten möchte? Ich habe es versucht, response.write(request.body)
aber Node.js löst eine Ausnahme aus, die besagt, dass "das erste Argument eine Zeichenfolge oder ein Puffer sein muss ", und wechselt dann zu einer "Endlosschleife" mit der Ausnahme, dass " Header nach dem Senden nicht festgelegt werden können ". Dies gilt auch, wenn ich es tat var reqBody = request.body;
und dann schrieb response.write(reqBody)
.
Was ist das Problem hier?
Kann ich die Rohanforderung auch nur ohne Verwendung erhalten express.bodyParser()
?
javascript
node.js
express
Der blaue Himmel
quelle
quelle
response.write(reqBody)
; Wenn ichresponse.send(reqBody)
Dinge benutze, funktionieren sie gut ... und ja, ich benutze sieresponse.end
danachresponse.write
.Antworten:
Express 4.0 und höher:
$ npm install --save body-parser
Und dann in Ihrer Knoten-App:
Express 3.0 und niedriger:
Versuchen Sie dies in Ihrem cURL-Aufruf zu übergeben:
--header "Content-Type: application/json"
und stellen Sie sicher, dass Ihre Daten im JSON-Format vorliegen:
{"user":"someone"}
Sie können auch console.dir in Ihrem node.js-Code verwenden, um die Daten im Objekt wie im folgenden Beispiel anzuzeigen:
Diese andere Frage könnte auch helfen: Wie empfange ich JSON in der POST-Anfrage von express node.js?
Wenn Sie den bodyParser nicht verwenden möchten, lesen Sie diese andere Frage: https://stackoverflow.com/a/9920700/446681
quelle
curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000
, es zu verwenden, aber es gab mir den Fehler " Unerwartetes Token u ". Deshalb habe ich in meinem ursprünglichen Beitrag zu dem genannten Anruf gewechselt.express.bodyParser()
ist in Express 4.x veraltet. Verwenden Sie stattdessen npmjs.org/package/body-parser .echo any"thing"
. Die Daten, die Sie veröffentlichen, sollten in Anführungszeichen stehen, um dies zu verhindern.Ab Express v4.16 sind keine zusätzlichen Module erforderlich. Verwenden Sie einfach die integrierte JSON-Middleware :
So was:
Hinweis -
body-parser
, von dem dies abhängt, ist bereits in Express enthalten.Vergessen Sie auch nicht, den Header zu senden
Content-Type: application/json
quelle
Ab Express 4 scheint der folgende Code den Trick zu tun. Beachten Sie, dass Sie benötigen zur Installation
body-parser
verwendennpm
.quelle
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true })
ist auch erforderlich? Ich poste ein ziemlich komplexes Dokument als JSON in der Anfrage undextended: false
habe nicht funktioniert. Erst wenn ich es auf true setze, wird die Anfrage korrekt analysiert.app.use(bodyParser.urlencoded({ extended: true }));
AND verwendenapp.use(bodyParser.json())
, um JSON-Daten auf einem AWS Linux-Server-Setup mit NodeJS und Express abzurufen.Das wird dir helfen. Ich nehme an, Sie schicken eine Leiche in json.
quelle
Für 2019 müssen Sie nicht installieren
body-parser
.Sie können verwenden:
quelle
Dies kann erreicht werden , ohne
body-parser
auch die Abhängigkeit, hörenrequest:data
undrequest:end
und gibt die Antwort auf Ende der Anfrage, siehe unten Codebeispiel. Ref: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-bodyquelle
Versuche dies:
Dadurch wird
bodyParser
das für Sie erstellte Objekt in einen String umgewandelt und in die Antwort geschrieben. Wenn Sie die genaue Anforderung Körper (mit dem gleichen Leerzeichen, etc.) wollen, müssen Siedata
undend
Zuhörer auf die Anfrage angebracht vor und die Zeichenfolge Chunk Chunk aufbauen , wie Sie im sehen json Parsing Quellcode von connect .quelle
Was Sie behaupten, "versucht zu haben", ist genau das, was Sie in den Code geschrieben haben, der "wie erwartet" funktioniert, wenn Sie ihn mit Curl aufrufen.
Der Fehler, den Sie erhalten, scheint nicht mit dem Code zu zusammenhängen, den Sie uns gezeigt haben.
Wenn Sie die rohe Anfrage erhalten möchten, setzen Sie Handler auf
request
derdata
undend
Ereignisse (und natürlich, entfernen Sie alle Beschwörungenexpress.bodyParser()
). Beachten Sie, dass diedata
Ereignisse in Blöcken auftreten und dassdata
diese Blöcke Puffer und keine Zeichenfolgen sind , sofern Sie keine Codierung für das Ereignis festlegen .quelle
request.body
und nichtrequest.body.user
, und ich korrigierte es jetzt. Übrigensvar reqBody = request.body;
war und ist das richtig und wenn Sie es versuchen, erhalten Sie den Fehler, den ich bekomme. Wie auch immer, können Sie bitte auf ein Beispiel geben über den Handler einstellenrequest
; Ich scheine es nicht im Expressführer zu finden.Wenn Sie faul genug sind, Teile von Post-Daten zu lesen. Sie können einfach die folgenden Zeilen einfügen, um json zu lesen.
Unten ist für TypeScript ähnlich, kann auch für JS durchgeführt werden.
app.ts
In einem Ihrer Controller, der einen POST-Anruf empfängt, verwenden Sie ihn wie unten gezeigt
userController.ts
quelle
Ich bin absolut neu in JS und ES, aber was für mich zu funktionieren scheint, ist genau das:
Lassen Sie mich wissen, wenn etwas nicht stimmt!
quelle
Installieren Sie Body Parser mit dem folgenden Befehl
Konfigurieren Sie den Body Parser
quelle
Sie verwenden den folgenden Code, um Postdaten zu protokollieren:
quelle