Plötzlich geschah dies bei all meinen Projekten.
Wann immer ich in nodejs einen Beitrag mit Hilfe von express und body-parser mache, ist req.body
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 Postman ist es immer leer.
Jedoch über curl
$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/
es funktioniert wie beabsichtigt.
Ich habe versucht, manuell Content-type : application/json
im vorherigen einzustellen, bekomme dann aber immer 400 bad request
Das hat mich verrückt gemacht.
Ich dachte, es sei etwas in Body-Parser, aber ich habe es herabgestuft und es hat nicht geholfen.
Jede Hilfe geschätzt, danke.
In Postman der 3 verfügbaren Optionen für den Inhaltstyp wählen Sie "X-www-form-urlencoded" und es sollte funktionieren.
Um auch die Fehlermeldung zu entfernen, ersetzen Sie:
app.use(bodyParser.urlencoded())
Mit:
app.use(bodyParser.urlencoded({
extended: true
}));
Siehe https://github.com/expressjs/body-parser
Die Middleware 'Body-Parser' verarbeitet nur JSON- und urlencodierte Daten, nicht mehrteilig
Wenn Sie mit Postman HTTP-Post-Aktionen mit einer Rohdatenquelle für JSON-Daten testen möchten, wählen Sie die Option raw
aus und legen Sie die folgenden Header-Parameter fest:
Content-Type: application/json
Stellen Sie außerdem sicher, dass alle Zeichenfolgen, die als Schlüssel/Werte in Ihrer JSON-Payload verwendet werden, in doppelte Anführungszeichen eingeschlossen werden.
Das body-parser
- Paket wird mehrzeilige rohe JSON-Payloads problemlos analysieren.
{
"foo": "bar"
}
In Chrome v37 und v41 mit der Erweiterung Postman v0.8.4.13 ( body-parser
v1.12.2 und express
v4.12.3) mit dem folgenden Setup getestet:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
// configure the app to use bodyParser()
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
// ... Your routes and methods here
Ich habe einen wirklich dummen Fehler gemacht und vergessen, name
-Attribute für Eingaben in meiner HTML-Datei zu definieren.
Also statt
<input type="password" class="form-control" id="password">
Ich habe das.
<input type="password" class="form-control" id="password" name="password">
Jetzt wird request.body
folgendermaßen gefüllt: { password: 'hhiiii' }
Ich habe festgestellt, dass es beim Versenden mit Inhaltstyp funktioniert
"application/json"
in Kombination mit serverseitig
app.use(bodyParser.json());
Jetzt kann ich per senden
var data = {name:"John"}
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", theUrl, false); // false for synchronous request
xmlHttp.setRequestHeader("Content-type", "application/json");
xmlHttp.send(data);
und das Ergebnis ist verfügbar in request.body.name
auf dem Server.
Ich bin heute auf dieses Problem gestoßen und was in der Folge beseitigt wurde, den Inhaltstyp-Header entfernen in Postman! Sehr eigenartig. Es hier hinzuzufügen, 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/
Sie müssen prüfen, ob die Body-Parser-Middleware korrekt auf die Art der Anforderung eingestellt ist (json, urlencoded).
Wenn Sie eingestellt haben,
app.use(bodyParser.json());
dann müssen Sie beim Postboten die Daten als Rohdaten versenden.
https://i.stack.imgur.com/k9IdQ.png postman screenshot
Wenn Sie eingestellt haben,
app.use(bodyParser.urlencoded({
extended: true
}));
dann sollte die Option 'x-www-form-urlencoded' ausgewählt werden.
Selbst als ich node.js zum ersten Mal lernte, als ich anfing, es über eine Web-App zu lernen, hatte ich alle diese Dinge in meiner Form in einer guten Art und Weise erledigt. Dennoch war ich nicht in der Lage, Werte in der Post-Anfrage zu erhalten. Nach langem Debuggen erfuhr ich, dass ich in dem Formular enctype="multipart/form-data"
angegeben habe, aufgrund dessen ich keine Werte erhalten konnte. Ich habe es einfach entfernt und es hat für mich funktioniert.
Mein Problem war, dass ich zuerst die Route erstellte
// ...
router.get('/post/data', myController.postHandler);
// ...
und Registrieren der Middlewarenachder Route
app.use(bodyParser.json());
//etc
durch App-Struktur & Kopieren und Einfügen des Projekts aus Beispielen.
Nachdem ich die Registrierung der Middleware vor der Route festgelegt hatte, funktionierte alles.
Wenn Sie keinen encType verwenden (der Standardwert ist application/x-www-form-urlencoded
), erhalten Sie anscheinend Texteingabefelder, aber keine Datei.
Wenn Sie über ein Formular verfügen, in das Sie Texteingaben und Dateien eingeben möchten, verwenden Sie den Codierungstyp multipart/form-data
und zusätzlich die multer
-Middleware. Multer analysiert das Anforderungsobjekt und bereitet req.file
für Sie vor, und alle anderen Eingabefelder sind über req.body
verfügbar.
Ich habe dieses Problem mit multer
gelöst, wie oben vorgeschlagen, aber es ist ihnen nicht gelungen, ein ausführliches Arbeitsbeispiel zu geben. Grundsätzlich kann dies passieren, wenn Sie eine Formulargruppe mit enctype="multipart/form-data"
haben. Hier ist der HTML-Code für das Formular, das ich hatte:
<form action="/stats" enctype="multipart/form-data" method="post">
<div class="form-group">
<input type="file" class="form-control-file" name="uploaded_file">
<input type="text" class="form-control" placeholder="Number of speakers" name="nspeakers">
<input type="submit" value="Get me the stats!" class="btn btn-default">
</div>
</form>
Und wie Sie mit multer
die Werte und Namen dieses Formulars mit Express.js
und node.js
erhalten:
var multer = require('multer')
var upload = multer({ dest: './public/data/uploads/' })
app.post('/stats', upload.single('uploaded_file'), function (req, res) {
// req.file is the name of your file in the form above, here 'uploaded_file'
// req.body will hold the text fields, if there were any
console.log(req.file, req.body)
});
Ein ähnliches Problem passierte mir, ich mischte einfach die Reihenfolge der Callback-Parameter. Stellen Sie sicher, dass Sie die Rückruffunktionen in der richtigen Reihenfolge einrichten. Zumindest für alle, die das gleiche Problem haben.
router.post('/', function(req, res){});
Stellen Sie sicher, dass ["key": "type", "value": "json"] & ["key": "Content-Type", "value": "application/x-www-form-urlencoded"] in Ihrem Postman-Anforderungsheader
sie sollten JSON.stringify (Daten) nicht ausführen, während Sie wie unten beschrieben durch AJAX senden
this is not correct code
function callAjax(url, data) {
$.ajax({
url: url,
type: "POST",
data: JSON.stringify(data),
success: function(d) {
alert("successs "+ JSON.stringify(d));
}
});
}
der richtige Code lautet
function callAjax(url, data) {
$.ajax({
url: url,
type: "POST",
data: data,
success: function(d) {
alert("successs "+ JSON.stringify(d));
}
});
}
Ich glaube das kann app.use(express.json());
lösen
Ich benutzte restify anstelle von express und stieß auf das gleiche Problem. Lösung war zu tun:
server.use (restify.bodyParser ());
Ich hatte den Namen nicht in meiner Eingabe ... meine Anfrage war leer ... froh, dass das erledigt ist und ich weiter codieren kann. Vielen Dank an alle!
Antwort, die ich von Jason Kim verwendet habe:
Also statt
<input type="password" class="form-control" id="password">
Ich habe das
<input type="password" class="form-control" id="password" name="password">
Ich hatte vor ein paar Minuten das gleiche Problem, ich habe alles Mögliche aus den obigen Antworten versucht, aber alle haben funktioniert.
Das einzige, was ich tat, war das Upgrade der Node JS-Version. Ich wusste nicht, dass das Upgrade etwas bewirken kann, aber es tat es.
Ich habe Node JS Version 10.15.0
(neueste Version) installiert, kehrte zu 8.11.3
zurück und alles funktioniert jetzt. Vielleicht sollte das body-parser
-Modul diesbezüglich eine Lösung finden.