523 Stimmen

Express.js req.body nicht definiert.

Ich habe das als Konfiguration meines Express-Servers:

app.use(app.router); 
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat" }));
app.set('view engine', 'ejs');
app.set("view options", { layout: true });
//Behandelt POST-Anfragen
app.use(express.bodyParser());
//Behandelt PUT-Anfragen
app.use(express.methodOverride());

Aber immer noch, wenn ich nach req.body.something in meinen Routen frage, erhalte ich einen Fehler, der darauf hinweist, dass body undefiniert ist. Hier ist ein Beispiel für eine Route, die req.body verwendet:

app.post('/admin', function(req, res){
    console.log(req.body.name);
});

Ich habe gelesen, dass dieses Problem durch das Fehlen von app.use(express.bodyParser()); verursacht wird, aber wie Sie sehen können, rufe ich es vor den Routen auf.

Irgendwelche Hinweise?

0 Stimmen

Es ist nicht wirklich eine Lösung für Ihr Problem, aber da dies der erste Thread ist, der aus Google-Ergebnissen resultiert, möchte ich hier erwähnen, dass darauf geachtet werden sollte, dass keine anderen fehlerhaften Middlewares verwendet werden.

9voto

user1614168 Punkte 185

Verwenden Sie app.use(bodyparser.json()); vor dem Routing. // . app.use("/api", routes);

9voto

Mayur Punkte 3405

Geschichte:

Frühere Versionen von Express hatten viele Middleware damit gebündelt. bodyParser war eine der Middleware, die damit geliefert wurde. Als Express 4.0 veröffentlicht wurde, beschlossen sie, die gebündelte Middleware aus Express zu entfernen und stattdessen separate Pakete daraus zu machen. Die Syntax änderte sich dann von app.use(express.json()) zu app.use(bodyParser.json()) nach der Installation des bodyParser Moduls.

bodyParser wurde in der Version 4.16.0 wieder zu Express hinzugefügt, weil die Leute es wieder gebündelt mit Express haben wollten. Das bedeutet, dass Sie bodyParser.json() nicht mehr verwenden müssen, wenn Sie auf der neuesten Version sind. Sie können stattdessen express.json() verwenden.

Die Versionsgeschichte für 4.16.0 finden Sie hier für diejenigen, die interessiert sind, und der Pull-Request befindet sich hier.

Okay, zurück zum Punkt,

Implementierung:

Alles was Sie hinzufügen müssen, ist einfach,

app.use(express.json());
app.use(express.urlencoded({ extended: true}));
app.use(app.router); // Die Route befindet sich am Ende des Parsers

Und entfernen Sie bodyParser (in neueren Versionen von Express ist es nicht mehr erforderlich)

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

Und Express kümmert sich um Ihre Anfrage. :)

Ein vollständiges Beispiel sieht so aus,

const express       = require('express')
const app           = express()

app.use(express.json())
app.use(express.urlencoded({ extended: true}));

app.post('/test-url', (req, res) => {
    console.log(req.body)
    return res.send("gut gelaufen")
})

app.listen(3000, () => {
    console.log("läuft auf Port 3000")
})

9voto

ab107 Punkte 91

Express.bodyParser() muss mitgeteilt werden, um welche Art von Inhalt es sich handelt, den es analysiert. Daher musst du sicherstellen, dass du beim Ausführen einer POST-Anfrage den Header "Content-Type" einschließt. Andernfalls weiß bodyParser möglicherweise nicht, was es mit dem Inhalt deiner POST-Anfrage anfangen soll.

Wenn du curl verwendest, um eine POST-Anfrage auszuführen, die ein JSON-Objekt im Body enthält, würde es ungefähr so aussehen:

curl -X POST -H "Content-Type: application/json" -d @dein_json_file http://localhost:xxxx/someRoute

Wenn du eine andere Methode verwendest, stelle einfach sicher, dass du dieses Header-Feld entsprechend der jeweiligen Konvention setzt.

8voto

Zunächst stellen Sie sicher, dass Sie dieses Middleware (express.urlencoded) vor den Routen anwenden.

let app = express();

// Antwort als Json
app.use(express.json());

// x-www-form-urlencoded-Anforderung in req.body umwandeln
app.use(express.urlencoded({ extended: true }));

app.post('/test',(req,res)=>{
    res.json(req.body);
});

Der Code express.urlencoded({extended:true}) reagiert nur auf x-www-form-urlencoded POST-Anfragen, also stellen Sie sicher, dass Sie im AJAX/XMLHttpRequest/fetch den Header request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); senden.

Das war's!

8voto

Sie können versuchen, diese Code-Zeile oben hinzuzufügen, (nach Ihren require-Anweisungen):

app.use(bodyParser.urlencoded({extended: true}));

Was die Gründe betrifft, warum es funktioniert, schauen Sie sich die Dokumentation an: https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X