it-swarm.com.de

req.body leer auf Beiträgen

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.

181
Joseph Dailey

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

206
Mick Cullen

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

Postman raw json payload

162
sirthud

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

42
Jason Kim

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.

27

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/

16
stone

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.

5
Tuan

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.

4
Shaggie

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.

3
fiat

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.

3
Mohammad Haque

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

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){});
2
Henry Ollarves

Stellen Sie sicher, dass ["key": "type", "value": "json"] & ["key": "Content-Type", "value": "application/x-www-form-urlencoded"] in Ihrem Postman-Anforderungsheader

1
vpage

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

0
Cleber Carvalho

Ich benutzte restify anstelle von express und stieß auf das gleiche Problem. Lösung war zu tun:

server.use (restify.bodyParser ());

0
Prabhat

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">
0
Luke McCormick

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.

0
Phi