Plötzlich ist dies bei allen meinen Projekten passiert.
Immer wenn ich mit node und body-parser einen Beitrag in nodejs mache, req.body
ist das ein leeres Objekt.
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())
// parse application/json
app.use(bodyParser.json())
app.listen(2000);
app.post("/", function (req, res) {
console.log(req.body) // populated!
res.send(200, req.body);
});
Über Ajax und Postbote ist es immer leer.
Jedoch über Curl
$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/
es funktioniert wie vorgesehen.
Ich habe versucht, Content-type : application/json
die erstere manuell einzustellen, aber ich bekomme dann immer400 bad request
Das hat mich verrückt gemacht.
Ich dachte, es wäre etwas, das im Body-Parser aktualisiert wurde, aber ich habe ein Downgrade durchgeführt und es hat nicht geholfen.
Jede Hilfe dankbar, danke.
Content-Type
Postboten explizit einzustellen? Wenn nicht, können Sie das versuchen, da ich zuvor Probleme mit dem Postboten hatte, der keine gesendet hatContent-Type
.Antworten:
Wählen Sie im Postboten der 3 verfügbaren Optionen für den Inhaltstyp "X-www-form-urlencoded" aus und es sollte funktionieren.
Auch um Fehlermeldung loszuwerden ersetzen:
Mit:
Siehe https://github.com/expressjs/body-parser
Die Middleware "Body-Parser" verarbeitet nur JSON- und urlencodierte Daten, keine mehrteiligen
quelle
app.use(express.json());
Um mit Postman HTTP-Postaktionen mit einer JSON-Rohdaten-Nutzlast zu testen, wählen Sie die
raw
Option aus und legen Sie die folgenden Header-Parameter fest:Stellen Sie außerdem sicher, dass alle Zeichenfolgen, die als Schlüssel / Werte in Ihrer JSON-Nutzlast verwendet werden, in doppelte Anführungszeichen gesetzt werden.
Das
body-parser
Paket analysiert mehrzeilige JSON-Raw-Payloads einwandfrei.Getestet in Chrome v37 und v41 mit der Erweiterung Postman v0.8.4.13 (
body-parser
v1.12.2 undexpress
v4.12.3) mit dem folgenden Setup:quelle
form-data
in Postman zum Posten der Daten erhalte ich immer die{}
in der req.body. Soll ich dieContent-Type
Option einstellen ?Ich habe einen wirklich dummen Fehler gemacht und vergessen,
name
Attribute für Eingaben in meiner HTML-Datei zu definieren .Also statt
Ich habe das.
Jetzt
request.body
ist wie folgt bevölkert:{ password: 'hhiiii' }
quelle
Ich habe festgestellt, dass es beim Senden mit Inhaltstyp funktioniert
in Kombination mit serverseitig
app.use(bodyParser.json());
Jetzt kann ich über senden
und das Ergebnis ist
request.body.name
auf dem Server verfügbar .quelle
xmlHttp.send(JSON.stringify(data));
Ich bin heute auf dieses Problem gestoßen, und was behoben wurde, war das Entfernen des inhaltlichen Headers in Postman! Sehr eigenartig. Fügen Sie es hier hinzu, falls es jemandem hilft.
Ich habe das BeerLocker-Tutorial hier verfolgt: http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/
quelle
Sie müssen überprüfen, ob die Body-Parser-Middleware richtig auf den Anforderungstyp (json, urlencoded) eingestellt ist.
Wenn Sie eingestellt haben,
dann müssen Sie im Postboten die Daten als roh senden.
https://i.stack.imgur.com/k9IdQ.png Postboten-Screenshot
Wenn Sie eingestellt haben,
dann sollte die Option 'x-www-form-urlencoded' ausgewählt werden.
quelle
Mein Problem war, dass ich zuerst die Route erstellt habe
und Registrieren der Middleware nach der Route
aufgrund der App-Struktur & Kopieren und Einfügen des Projekts aus Beispielen.
Nachdem ich die Reihenfolge für die Registrierung der Middleware vor der Route festgelegt hatte, funktionierte alles.
quelle
Selbst als ich node.js zum ersten Mal lernte, als ich anfing, es über eine Web-App zu lernen, hatte ich all diese Dinge in meiner Form gut gemacht, aber ich konnte keine Werte in der Post-Anfrage erhalten. Nach langem Debuggen wurde mir klar, dass ich in der von mir bereitgestellten Form
enctype="multipart/form-data"
keine Werte erhalten konnte. Ich habe es einfach entfernt und es hat bei mir funktioniert.quelle
enctype="multipart/form-data"
multer
zum LaufenWenn Sie keinen encType verwenden (Standard ist
application/x-www-form-urlencoded
), erhalten Sie zwar Texteingabefelder, aber keine Datei.Wenn Sie ein Formular haben, in dem Sie Texteingaben und Dateien veröffentlichen möchten, verwenden Sie den
multipart/form-data
Codierungstyp und zusätzlichmulter
Middleware. Multer analysiert das Anforderungsobjekt und bereitet sichreq.file
auf Sie vor. Alle anderen Eingabefelder sind über verfügbarreq.body
.quelle
multer
war in der Tat die Lösung für mein Problem. Es wäre gut, wenn Sie ein Beispiel hinzufügen könnten, wie Sie dies als Teil Ihrer Antwort verwenden könnenEin ähnliches Problem ist mir passiert, ich habe einfach die Reihenfolge der Rückrufparameter gemischt. Stellen Sie sicher, dass Sie die Rückruffunktionen in der richtigen Reihenfolge einrichten. Zumindest für alle, die das gleiche Problem haben.
quelle
Stellen Sie sicher, dass ["key": "type", "value": "json"] & ["key": "Content-Type", "value": "application / x-www-form-urlencoded"] in Ihrem enthalten ist Postbotenanforderungsheader
quelle
Ich habe dieses Problem
multer
wie oben vorgeschlagen gelöst , aber sie haben es versäumt, ein ausführliches Beispiel dafür zu geben. Grundsätzlich kann dies passieren, wenn Sie eine Formulargruppe mit habenenctype="multipart/form-data"
. Hier ist der HTML-Code für das Formular, das ich hatte:Und hier erfahren Sie, wie
multer
Sie die Werte und Namen dieses Formulars mitExpress.js
und abrufen könnennode.js
:quelle
Ich hatte vor ein paar Minuten das gleiche Problem, ich habe alles Mögliche in den obigen Antworten versucht, aber jede davon hat funktioniert.
Das einzige, was ich getan habe, war das Upgrade der Node JS-Version. Ich wusste nicht, dass ein Upgrade Auswirkungen auf etwas haben könnte, aber es tat es.
Ich habe die Node JS-Version
10.15.0
(neueste Version) installiert , bin zurückgekehrt8.11.3
und alles funktioniert jetzt. Vielleichtbody-parser
sollte das Modul dies beheben.quelle
Ich hatte den Namen nicht in meiner Eingabe ... meine Anfrage war leer ... froh, dass das fertig ist und ich weiter codieren kann. Vielen Dank an alle!
Antwort, die ich von Jason Kim verwendet habe:
Also statt
ich habe das
quelle
Sie sollten dies nicht tun,
JSON.stringify(data)
während Sie wie unten beschrieben über AJAX senden.Dies ist KEIN korrekter Code:
Der richtige Code lautet:
quelle
Wenn Sie mit dem Postboten arbeiten, bestätigen Sie diese Informationen, wenn Sie eine API anfordern
quelle
Ich habe restify anstelle von express verwendet und bin auf dasselbe Problem gestoßen. Die Lösung war zu tun:
quelle
Ich glaube, das kann sich lösen
app.use(express.json());
quelle
Ändern Sie
app.use(bodyParser.urlencoded());
Ihren Code inund im Postboten ändern Sie im Header den
Content-Type
Wert vonapplication/x-www-form-urlencoded
bisapplication/json
Ta :-)
quelle
Vielen Dank für Ihre tollen Antworten! Ich habe einige Zeit auf der Suche nach einer Lösung verbracht und auf meiner Seite einen elementaren Fehler gemacht: Ich habe
bodyParser.json()
innerhalb der Funktion aufgerufen:Ich musste es nur tun
app.use(['/password'], bodyParser.json())
und es funktionierte ...quelle
Beim Postboten bekam ich, selbst nachdem ich der akzeptierten Antwort gefolgt war, einen leeren Anfragetext. Es stellte sich heraus, dass kein Header namens aufgerufen wurde
Dieser Header war standardmäßig vorhanden (zusammen mit 5 anderen), die ich deaktiviert habe. Wenn Sie dies aktivieren, erhalten Sie den Anfragetext.
quelle
Mein Problem war, zuerst die Route zu erstellen.
require("./routes/routes")(app);
Ich habe sie vorher an das Ende des Codes verschobenapp.listen
und es hat funktioniert!quelle