Express js req.body devuelve vacío

He probado todas las soluciones de otras publicaciones de stackoverflow pero no resolví mi problema.

Aquí está mi app.js

 var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // uncomment after placing your favicon in /public //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(logger('dev')); app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); var index = require('./routes/index'); var v1 = require('./routes/route'); app.use('/', index); //routes for api app.use('/v1',v1); 

Aquí está mi controlador de post

 module.exports = { createUser:function (req,res) { console.log(req.body); res.send('ok'+req.body.test); } } 

req.body devuelve {} incluso si el cuerpo de la solicitud contiene los parámetros.

Estoy revisando la API con el plugin de cartero.

Actualizar

Solicitud del cartero

introduzca la descripción de la imagen aquí

body-parser

El objeto bodyParser expone varias fábricas para crear middlewares. Todos los middlewares poblarán la propiedad req.body con el cuerpo analizado, o un objeto vacío {} si no había ningún cuerpo para analizar (o se devolvió un error).


 app.use(bodyParser.urlencoded({ extended: true })); // for encoded bodies 

Un nuevo objeto de cuerpo que contiene los datos analizados se rellena en el objeto de solicitud después del middleware, req.body contendrá los datos analizados, este objeto contendrá pares clave-valor, donde el valor puede ser una cadena o matriz

El tipo de contenido es application/x-www-form-urlencoded


 app.use(bodyParser.json()); // for json encoded bodies 

Un nuevo objeto de cuerpo que contiene los datos analizados se rellena en el objeto de solicitud después del middleware (es decir, req.body ).

El tipo de contenido es application/json


application/json se usa cuando publicas los datos {"test":"hello"} esta manera. www-form-url-encoded se usa para obtener los datos como clave-valor en el objeto de la url cuando se usa app.use(bodyParser.urlencoded({ extended: true })); . Ambos son diferentes y tienen sus propios casos de uso.

Después de eliminar las últimas 4 líneas de código (para asegurarse de que está configurando correctamente las rutas) y agregar estas líneas de prueba:

 app.post('/ping', function (req,res) { console.log(req.body); res.send('ok ' + req.body.test); }); let server = http.createServer(app); server.listen(8899, function onstart() { console.log('server listening'); }); 

Cuando corro

 curl -X POST http://localhost:8899/ping -d '{"test": 1234}' 

Me pongo ok undefined , como hiciste tú. Después de agregar el encabezado de content-type adecuado:

 curl -X POST http://localhost:8899/ping -d '{"test": 1234}' -H "content-type: application/json" 

Funciona como un encanto y me sale ok 1234 . Así que creo que le falta el encabezado "content-type: application/json" en su cartero.