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.

5voto

isdot Punkte 51
var bodyParser = require('body-parser');
app.use(bodyParser.json());

Dies hat meinen Tag gerettet.

5voto

HenioJR Punkte 574

Um zu arbeiten, müssen Sie app.use(app.router) nach app.use(express.bodyParser()) verwenden, wie folgt:

app.use(express.bodyParser())
   .use(express.methodOverride())
   .use(app.router);

5voto

In meinem Fall lag es daran, dass ich body-parser nach dem Einbinden der Routen verwendet habe.

Der korrekte Code sollte sein

app.use(bodyParser.urlencoded({extended:true}));
app.use(methodOverride("_method"));
app.use(indexRoutes);
app.use(userRoutes);
app.use(adminRoutes);

4voto

Greggory Wiley Punkte 392

In express 4 and above you don't need body parser they have their own json parse method, Auf der höchsten Ebene Ihrer Express-App fügen Sie hinzu:

var express = require('express');
var app = express()
app.use(express.json()); //deklarieren Sie dies, um JSON-Objekte zu empfangen.

Andere Antworten haben nicht erwähnt, dass bei der Anforderung an Express über fetch oder andere Clients die Anforderung auf eine bestimmte Weise formatiert sein muss.

const response = await fetch(`${expressAddress}/controller/route`, { 
      method: 'POST', // *GET, POST, PUT, DELETE, etc.
      headers: {
          'Content-Type': 'application/json' //dies muss auf einen JSON-Typ gesetzt werden
      },
      body: JSON.stringify(row) //ein reguläres JS-Objekt muss in JSON umgewandelt werden
  })

Wenn Sie die fetch-Anfrage so machen, wird req.body Ihr JSON-Objekt wie erwartet ausgeben.

4voto

Marci Punkte 210

Wenn ich bodyParser benutze, wird es als veraltet markiert. Um dies zu vermeiden, verwende ich den folgenden Code mit express anstelle von bodyParser.

Hinweis: Die Routen müssen unbedingt am Ende deklariert werden, das ist wichtig! Andere Antworten hier haben das Problem gut beschrieben.

const express = require("express");
const app = express();

const routes = require('./routes/api');

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

// Routen müssen am Ende deklariert werden
app.use('/', routes);

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