Express.js req.body undefined

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 aun así, cuando solicito req.body.something en mis rutas, recibo un error al señalar que el body is undefined . Aquí hay un ejemplo de una ruta que usa 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 pueden ver, lo llamo antes de las rutas.

¿Cualquier pista?

Debe asegurarse de definir todas las configuraciones ANTES de definir las rutas. Si lo hace, puede seguir utilizando 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.use(app.router); }); app.listen(port); app.post("/someRoute", function(req, res) { console.log(req.body); res.send({ status: 'SUCCESS' }); }); 

Las últimas versiones de Express (4.x) han desglosado el middleware del framework principal. Si necesita un analizador corporal, 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()) 

No. app.use(express.bodyParser()) usar app.use(express.bodyParser()) antes de app.use(app.router) . De hecho, app.use(app.router) debería ser lo último que llame.

Primero asegúrese de haber instalado el módulo npm llamado ‘body-parser’ llamando a:

 npm install body-parser --save 

Luego asegúrese de haber incluido las siguientes líneas antes de llamar a las rutas

 var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.json()); 

El encabezado de solicitud de tipo de contenido es realmente importante, especialmente cuando publica datos de curl u otras herramientas.

Asegúrate de estar usando algo como application / x-www-form-urlencoded, application / json u otros, depende de tus datos de publicación. Dejar este campo en blanco confundirá Express.

Como ya se publicó en un comentario, lo resolví usando

 app.use(require('connect').bodyParser()); 

en lugar de

 app.use(express.bodyParser()); 

Todavía no sé por qué el simple express.bodyParser() no funciona …

 // Require body-parser (to receive post data from clients) var bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({ extended: false })) // parse application/json app.use(bodyParser.json()) 

Express.bodyParser () necesita que se le diga qué tipo de contenido está analizando. Por lo tanto, debe asegurarse de que cuando está ejecutando una solicitud POST, esté incluyendo el encabezado “Content-Type”. De lo contrario, bodyParser puede no saber qué hacer con el cuerpo de su solicitud POST.

Si está utilizando curl para ejecutar una solicitud POST que contiene algún objeto JSON en el cuerpo, se vería algo así:

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

Si usa otro método, simplemente asegúrese de establecer ese campo de encabezado usando la convención que sea apropiada.

Parece que el analizador corporal ya no se envía con Express. Es posible que tengamos que instalarlo por separado.

 var express = require('express') 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()) // parse application/vnd.api+json as json app.use(bodyParser.json({ type: 'application/vnd.api+json' })) app.use(function (req, res, next) { console.log(req.body) // populated! 

Consulte la página de git https://github.com/expressjs/body-parser para obtener más información y ejemplos.

Esto me sucedió hoy. Ninguna de las soluciones anteriores funciona para mí. Pero un poco de google me ayudó a resolver este problema. Estoy codificando el servidor de terceros de wechat.

Las cosas se vuelven un poco más complicadas cuando su aplicación node.js requiere leer los datos POST de transmisión, como una solicitud de un cliente REST. En este caso, la propiedad de la solicitud “legible” se establecerá como verdadera y los datos POST se deben leer en fragmentos para recostackr todo el contenido.

http://www.primaryobjects.com/CMS/Article144

Para trabajar, debes aplicar app.use (app.router) después de app.use (express.bodyParser ()) , así:

 app.use(express.bodyParser()) .use(express.methodOverride()) .use(app.router); 
 var bodyParser = require('body-parser'); app.use(bodyParser.json()); 

Esto me salvó el día.

Perdió mucho tiempo:

Dependiendo del tipo de contenido en su solicitud del cliente
el servidor debe tener diferente, una de las siguientes app.use ():

 app.use(bodyParser.text({ type: 'text/html' })) app.use(bodyParser.text({ type: 'text/xml' })) app.use(bodyParser.raw({ type: 'application/vnd.custom-type' })) app.use(bodyParser.json({ type: 'application/*+json' })) 

Fuente: https://www.npmjs.com/package/body-parser#bodyparsertextoptions

Ejemplo:

Para mí, en el lado del cliente, tenía el siguiente encabezado:

 Content-Type: "text/xml" 

Entonces, en el lado del servidor, utilicé:

 app.use(bodyParser.text({type: 'text/xml'})); 

Entonces, req.body funcionó bien.

Puedes usar el analizador de cuerpo express.

 var express = require('express'); var app = express(); var bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({ extended: true })); 

En caso de que publique un mensaje SOAP, debe usar el analizador de cuerpo sin procesar:

 var express = require('express'); var app = express(); var bodyParser = require('body-parser'); app.use(bodyParser.raw({ type: 'text/xml' })); 

Basándose en @ kevin-xue dijo, el tipo de contenido debe ser declarado. En mi caso, esto solo ocurría con IE9 porque XDomainRequest no establece un tipo de contenido , por lo que bodyparser y expressjs ignoraron el cuerpo de la solicitud.

Lo solucioné configurando explícitamente el tipo de contenido antes de pasar la solicitud al analizador del cuerpo, así:

 app.use(function(req, res, next) { // IE9 doesn't set headers for cross-domain ajax requests if(typeof(req.headers['content-type']) === 'undefined'){ req.headers['content-type'] = "application/json; charset=UTF-8"; } next(); }) .use(bodyParser.json()); 

Gracias a @spikeyang por la excelente respuesta (proporcionada a continuación). Después de leer el artículo sugerido adjunto a la publicación, decidí compartir mi solución.

¿Cuándo usar?

La solución requería que utilizaras el enrutador express para disfrutarlo … entonces: si has tratado de usar la respuesta aceptada sin suerte, solo usa copiar y pegar esta función:

 function bodyParse(req, ready, fail) { var length = req.header('Content-Length'); if (!req.readable) return fail('failed to read request'); if (!length) return fail('request must include a valid `Content-Length` header'); if (length > 1000) return fail('this request is too big'); // you can replace 1000 with any other value as desired var body = ''; // for large payloads - please use an array buffer (see note below) req.on('data', function (data) { body += data; }); req.on('end', function () { ready(body); }); } 

y llámalo así:

 bodyParse(req, function success(body) { }, function error(message) { }); 

NOTA: Para cargas útiles grandes, utilice un búfer de matriz ( más @ MDN )

En caso de que alguien se encuentre con el mismo problema que estaba teniendo; Estoy usando un prefijo de url como

 http://example.com/api/ 

que fue configurado con enrutador

 app.use('/api', router); 

y luego tuve lo siguiente

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

Lo que solucionó mi problema era colocar la configuración del analizador de cuerpo encima de app.use('/api', router);

Final

 // setup bodyparser app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); //this is a fix for the prefix of example.com/api/ so we dont need to code the prefix in every route app.use('/api', router); 

Express 4, tiene un analizador corporal incorporado. No es necesario instalar un analizador corporal separado. Entonces a continuación funcionará:

 export const app = express(); app.use(express.json()); 

Puede intentar agregar esta línea de código en la parte superior (después de sus declaraciones requeridas):

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

En cuanto a las razones de por qué funciona, consulte los documentos: https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions