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.bodyes 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/jsonen 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-Typecartero? 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
rawopció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-parserpaquete 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-parserv1.12.2 yexpressv4.12.3) con la siguiente configuración:fuente
form-dataen Postman para publicar los datos, siempre obtengo el{}en el req.body. ¿Debo establecer laContent-Typeopción?Cometí un error realmente tonto y olvidé definir
nameatributos para las entradas en mi archivo html.Entonces en lugar de
Tengo esto.
Ahora
request.bodyse 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.nameel 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-datatipo de codificación y, además, usemultermiddleware. Multer analizará el objeto de solicitud y se prepararáreq.filepara usted y todos los demás campos de entrada estarán disponibles a través dereq.body.fuente
multerhecho 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
multercomo 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
multerpara obtener los valores y nombres de este formulario conExpress.jsynode.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.3y ahora todo funciona. Tal vez elbody-parsermó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-Typevalor de cambio de encabezado deapplication/x-www-form-urlencodedaapplication/jsonEjé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.listeny 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