De repente, esto ha estado sucediendo a todos mis proyectos.
Cada vez que hago una publicación en nodejs usando express y body-parser req.body
es un objeto vacío.
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())
// parse application/json
app.use(bodyParser.json())
app.listen(2000);
app.post("/", function (req, res) {
console.log(req.body) // populated!
res.send(200, req.body);
});
A través de ajax y cartero siempre está vacío.
Sin embargo a través de curl
$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/
Funciona según lo previsto.
Traté de configurar manualmente Content-type : application/json
en el primero pero siempre obtengo400 bad request
Esto me ha estado volviendo loco.
Pensé que era algo actualizado en el analizador del cuerpo, pero lo degradé y no ayudó.
Cualquier ayuda apreciada, gracias.
Content-Type
cartero? Si no, puede intentarlo, ya que he tenido problemas antes con el cartero no enviando unContent-Type
.Respuestas:
En Cartero de las 3 opciones disponibles para el tipo de contenido, seleccione "X-www-form-urlencoded" y debería funcionar.
También para deshacerse del mensaje de error, reemplace:
Con:
Ver https://github.com/expressjs/body-parser
El middleware 'body-parser' solo maneja datos JSON y urlencoded, no multiparte
fuente
app.use(express.json());
Con Postman, para probar las acciones de publicación HTTP con una carga de datos JSON sin procesar, seleccione la
raw
opción y configure los siguientes parámetros de encabezado:Además, asegúrese de ajustar las cadenas utilizadas como claves / valores en su carga útil JSON entre comillas dobles.
El
body-parser
paquete analizará las cargas útiles JSON crudas de varias líneas muy bien.Probado en Chrome v37 y v41 con la extensión Postman v0.8.4.13 (
body-parser
v1.12.2 yexpress
v4.12.3) con la siguiente configuración:fuente
form-data
en Postman para publicar los datos, siempre obtengo el{}
en el req.body. ¿Debo establecer laContent-Type
opción?Cometí un error realmente tonto y olvidé definir
name
atributos para las entradas en mi archivo html.Entonces en lugar de
Tengo esto.
Ahora
request.body
se rellena así:{ password: 'hhiiii' }
fuente
Descubrí que funciona al enviar con tipo de contenido
en combinación con el lado del servidor
app.use(bodyParser.json());
Ahora puedo enviar vía
y el resultado está disponible en
request.body.name
el servidor.fuente
xmlHttp.send(JSON.stringify(data));
¡Me encontré con este problema hoy, y lo que solucionó fue eliminar el encabezado de tipo contenido en Postman! Muy extraño. Agregándolo aquí en caso de que ayude a alguien.
Estaba siguiendo el tutorial de BeerLocker aquí: http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/
fuente
Debe verificar si el middleware body-parser está configurado correctamente para el tipo de solicitud (json, urlencoded).
Si has establecido,
entonces en cartero tienes que enviar los datos como sin procesar.
https://i.stack.imgur.com/k9IdQ.png captura de pantalla del cartero
Si has establecido,
entonces se debe seleccionar la opción 'x-www-form-urlencoded'.
fuente
Mi problema fue que estaba creando la ruta primero
y registrar el middleware después de la ruta
debido a la estructura de la aplicación y copiar y pegar el proyecto juntos a partir de ejemplos.
Una vez que arreglé el pedido para registrar el middleware antes de la ruta, todo funcionó.
fuente
Incluso cuando estaba aprendiendo node.js por primera vez donde comencé a aprenderlo a través de la aplicación web, estaba haciendo todas estas cosas de manera correcta en mi forma, aún no podía recibir valores en la solicitud posterior. Después de una larga depuración, llegué a saber que en la forma que he proporcionado
enctype="multipart/form-data"
debido a que no pude obtener valores. Simplemente lo eliminé y funcionó para mí.fuente
enctype="multipart/form-data"
multer
- vea la documentación en npmjs.com/package/multerParece que si no usa ningún encType (el valor predeterminado es
application/x-www-form-urlencoded
), entonces obtiene campos de entrada de texto pero no obtendría el archivo.Si tiene un formulario en el que desea publicar entradas de texto y archivos, use el
multipart/form-data
tipo de codificación y, además, usemulter
middleware. Multer analizará el objeto de solicitud y se prepararáreq.file
para usted y todos los demás campos de entrada estarán disponibles a través dereq.body
.fuente
multer
hecho fue la solución a mi problema. Sería bueno si pudiera agregar un ejemplo sobre cómo usar esto como parte de su respuestaMe ocurrió un problema similar, simplemente mezclé el orden de los parámetros de devolución de llamada. Asegúrese de configurar las funciones de devolución de llamada en el orden correcto. Al menos para cualquiera que tenga el mismo problema.
fuente
Asegúrese de que ["key": "type", "value": "json"] & ["key": "Content-Type", "value": "application / x-www-form-urlencoded"] esté en su encabezados de solicitud de cartero
fuente
Resolví esto usando
multer
como se sugirió anteriormente, pero no dieron un ejemplo de trabajo completo sobre cómo hacerlo. Básicamente esto puede suceder cuando tienes un grupo de formularios conenctype="multipart/form-data"
. Aquí está el HTML para el formulario que tenía:Y aquí se explica cómo usar
multer
para obtener los valores y nombres de este formulario conExpress.js
ynode.js
:fuente
Tuve el mismo problema hace unos minutos, intenté todo lo posible en las respuestas anteriores, pero ninguno de ellos funcionó.
Lo único que hice fue actualizar la versión Node JS, no sabía que la actualización podría afectar en algo, pero lo hizo.
He instalado la versión Node JS
10.15.0
(última versión), regresé8.11.3
y ahora todo funciona. Tal vez elbody-parser
módulo debería solucionarlo.fuente
No tenía el nombre en mi entrada ... mi solicitud estaba vacía ... contento de que haya terminado y pueda seguir codificando. ¡Gracias a todos!
Respuesta que utilicé Jason Kim:
Entonces en lugar de
tengo esto
fuente
no debe hacer
JSON.stringify(data)
mientras envía a través de AJAX como a continuaciónEste NO es el código correcto:
El código correcto es:
fuente
Si lo está haciendo con el cartero, confirme estas cosas cuando solicite API
fuente
Estaba usando restify en lugar de express y me encontré con el mismo problema. La solución fue hacer:
fuente
Creo que esto puede resolver
app.use(express.json());
fuente
Cambie
app.use(bodyParser.urlencoded());
su código ay en cartero, en el
Content-Type
valor de cambio de encabezado deapplication/x-www-form-urlencoded
aapplication/json
Ejército de reserva:-)
fuente
¡Gracias a todos por sus excelentes respuestas! Pasé bastante tiempo buscando una solución y, por mi parte, estaba cometiendo un error elemental: estaba llamando
bodyParser.json()
desde la función:Solo necesitaba hacerlo
app.use(['/password'], bodyParser.json())
y funcionó ...fuente
En cartero, incluso después de seguir la respuesta aceptada, recibía un cuerpo de solicitud vacío. El problema resultó no ser pasar un encabezado llamado
Este encabezado estaba presente por defecto (junto con otros 5) que he desactivado. Habilite esto y recibirá el cuerpo de la solicitud.
fuente
Mi problema fue crear la ruta primero. ¡
require("./routes/routes")(app);
Lo cambié al final del código antesapp.listen
y funcionó!fuente
Ya resuelto el problema, pero puede ayudar a alguien.
Procure que cada uno de sus elementos de formulario tenga algún nombre asociado. Este fue el error que estaba cometiendo ...!
fuente