Express.js req.body indefinido

Resuelto Masiar asked hace 12 años • 52 respuestas

Tengo esto como configuración de mi servidor Express.

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 });
//Handles post requests
app.use(express.bodyParser());
//Handles put requests
app.use(express.methodOverride());

Pero aún así, cuando pregunto req.body.somethingen mis rutas, aparece un error que me indica eso body is undefined. A continuación se muestra un ejemplo de una ruta que utiliza req.body:

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

Leí que este problema es causado por la falta de app.use(express.bodyParser());pero como puedes ver lo llamo antes que las rutas.

¿Cualquier pista?

Masiar avatar Feb 07 '12 20:02 Masiar
Aceptado

ACTUALIZACIÓN julio 2020

express.bodyParser()ya no está incluido como parte de Express. Debe instalarlo por separado antes de cargar:

npm i body-parser


// then in your app
var express = require('express')
var bodyParser = require('body-parser')
 
var app = express()
 
// create application/json parser
var jsonParser = bodyParser.json()
 
// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })
 
// POST /login gets urlencoded bodies
app.post('/login', urlencodedParser, function (req, res) {
  res.send('welcome, ' + req.body.username)
})
 
// POST /api/users gets JSON bodies
app.post('/api/users', jsonParser, function (req, res) {
  // create user in req.body
})

Ver aquí para más información

sigue el original

Debe asegurarse de definir todas las configuraciones ANTES de definir rutas. Si lo hace, podrá continuar usando express.bodyParser().

Un ejemplo es el siguiente:

var express = require('express'),
    app     = express(),
    port    = parseInt(process.env.PORT, 10) || 8080;

app.configure(function(){
  app.use(express.bodyParser());
});

app.listen(port);
    
app.post("/someRoute", function(req, res) {
  console.log(req.body);
  res.send({ status: 'SUCCESS' });
});
Mark Bonano avatar Dec 08 '2012 16:12 Mark Bonano

Las últimas versiones de Express (4.x) han separado el middleware del marco central. Si necesita un analizador de cuerpo, debe instalarlo por separado.

npm install body-parser --save

y luego haz esto en tu código

var bodyParser = require('body-parser')
var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())
Jay avatar Jan 09 '2015 06:01 Jay

Express 4, tiene un analizador de cuerpo incorporado. No es necesario instalar un analizador de cuerpo separado. Así que a continuación funcionará:

export const app = express();
app.use(express.json());
TechTurtle avatar Jun 28 '2018 20:06 TechTurtle