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 solicito req.body.something
en mis rutas, aparece un error que lo señala 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 puede ver, lo llamo antes de las rutas.
¿Cualquier pista?
Las últimas versiones de Express (4.x) han desagregado el middleware del framework central. Si necesita un analizador corporal, debe instalarlo por separado
y luego haz esto en tu código
fuente
app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json())
me salvó !!No. Necesitas usar
app.use(express.bodyParser())
antesapp.use(app.router)
. De hecho,app.use(app.router)
debería ser lo último que llames.fuente
app.use(app.router)
bajo las.use
llamadas no resuelve el problema :(.app.use(require('connect').bodyParser());
lugar deapp.use(express.bodyParser());
.var router=express.Router()
;Primero asegúrese de haber instalado el módulo npm llamado 'body-parser' llamando a:
Luego, asegúrese de haber incluido las siguientes líneas antes de llamar a las rutas
fuente
Express 4, tiene un analizador de cuerpo incorporado. No es necesario instalar un analizador de cuerpo por separado. Entonces a continuación funcionará:
fuente
El tipo de contenido en el encabezado de solicitud es realmente importante, especialmente cuando publica los datos de curl o cualquier otra herramienta.
Asegúrese de estar usando algo como application / x-www-form-urlencoded, application / json u otros, depende de los datos de su publicación. Dejar este campo vacío confundirá Express.
fuente
Como ya se publicó bajo un comentario, lo resolví usando
en vez de
Todavía no sé por qué lo simple
express.bodyParser()
no funciona ...fuente
connect
módulo a travésnpm install connect
y vuelva a intentarlo. Esto es lo único que se me ocurre al leer el resultado de su error.Content-Type
encabezadoapplication/json
.Content-Type
encabezadoapplication/json
cuando estaba haciendo mi solicitud.application/json
vstext/json
en la solicitud funciona, como lo sugiere @GrantEagon.fuente
Agrega tu
app.js
antes de la llamada del enrutador
fuente
Parece que el analizador de cuerpo ya no se envía con express. Es posible que tengamos que instalarlo por separado.
Consulte la página de git https://github.com/expressjs/body-parser para obtener más información y ejemplos.
fuente
En caso de que alguien se encuentre con el mismo problema que estaba teniendo; Estoy usando un prefijo de URL como
que se configuró con el enrutador
y luego tuve lo siguiente
Lo que solucionó mi problema fue colocar la configuración del bodyparser arriba
app.use('/api', router);
Final
fuente
express.bodyParser () necesita que se le diga qué tipo de contenido es el que está analizando. Por lo tanto, debe asegurarse de que cuando ejecute una solicitud POST, incluya el encabezado "Tipo de contenido". De lo contrario, bodyParser podría 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 así:
Si usa otro método, solo asegúrese de establecer ese campo de encabezado usando la convención apropiada.
fuente
Use app.use (bodyparser.json ()); antes de enrutar. //. app.use ("/ api", rutas);
fuente
Puede intentar agregar esta línea de código en la parte superior (después de sus declaraciones de requerimiento):
En cuanto a las razones de por qué funciona, consulte los documentos: https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions
fuente
La mayoría de las veces, req.body no está definido debido a que falta el analizador JSON
podría faltar para el analizador de cuerpo
y a veces no está definido debido al origen de los cros, así que agrégalos
fuente
Esto me ocurrió hoy. Ninguna de las soluciones anteriores funciona para mí. Pero un poco de google me ayudó a resolver este problema. Estoy codificando para el servidor de terceros wechat.
Las cosas se vuelven un poco más complicadas cuando su aplicación node.js requiere leer datos POST de transmisión, como una solicitud de un cliente REST. En este caso, la propiedad de la solicitud "legible" se establecerá en verdadera y los datos POST deben leerse en fragmentos para recopilar todo el contenido.
http://www.primaryobjects.com/CMS/Article144
fuente
Perdido mucho tiempo:
Dependiendo del tipo de contenido en la solicitud de su cliente,
el servidor debe tener una aplicación diferente, a continuación, use.) ():
Fuente: https://www.npmjs.com/package/body-parser#bodyparsertextoptions
Ejemplo:
Para mí, en el lado del cliente, tenía debajo del encabezado:
Entonces, en el lado del servidor, usé:
Entonces, req.body funcionó bien.
fuente
en Express 4, es realmente simple
fuente
Para trabajar, necesita app.use (app.router) después de app.use (express.bodyParser ()) , así:
fuente
app.use
elapp.router
antesexpress.bodyParser
, pero su código indica claramente son más de las. Entonces, ¿cuál es?Esto me salvó el día.
fuente
Este problema puede deberse a que no ha utilizado body-parser ( enlace )
fuente
Lo resolví con:
fuente
Esta también es una posibilidad : asegúrese de escribir este código antes de la ruta en su archivo app.js (o index.js).
fuente
Puede usar el analizador corporal exprés.
fuente
La última versión de Express ya tiene incorporado el analizador de cuerpo. Entonces puedes usar:
fuente
En caso de que publique un mensaje SOAP, debe usar un analizador de cuerpo sin procesar:
fuente
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 ignoraban el cuerpo de la solicitud.
Lo solucioné estableciendo el tipo de contenido explícitamente antes de pasar la solicitud al analizador de cuerpo, de esta manera:
fuente
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 usaras el enrutador rápido para disfrutarlo ... así que: si has intentado usar la respuesta aceptada sin suerte, solo usa copiar y pegar esta función:
y lo llaman así:
NOTA: Para cargas grandes, utilice un búfer de matriz ( más @ MDN )
fuente
Si está utilizando alguna herramienta externa para realizar la solicitud, asegúrese de agregar el encabezado:
Content-Type: application/json
fuente
Para cualquiera que no haya trabajado ninguna de las respuestas anteriores, tuve que habilitar los cors entre mi front-end y express.
Puedes hacer esto ya sea por:
Descargar y activar una extensión CORS para su navegador, como:
https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en
para Chrome,
o por
Agregar las líneas
a tu
app.js
página express . (Despuésnpm install cors
)fuente