Extracción de datos POST con Express
Frecuentes
Visto 6,454 veces
4
he leído node.js Extrayendo datos POST.
Pero aquí está mi problema, cómo extraer datos POST con Express cuando recibí una solicitud HTTP con este aspecto?
POST /messages HTTP/1.1
Host: localhost:3000
Connection: keep-alive
Content-Length: 9
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5
Content-Type: application/xml
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4 Accept-Charset: UTF-8,*;q=0.5
msg=hello
Parece que no puedo conseguir el msg=hello
par clave-valor fuera del cuerpo con Express.
He probado todos estos métodos req.header()
req.param()
req.query()
req.body
pero parecen estar vacíos.
¿Cómo obtener el contenido del cuerpo?
app.post('/messages', function (req, res) {
req.??
});
5 Respuestas
3
Su problema es que bodyParser no maneja 'aplicación/xml', lo resolví principalmente leyendo esta publicación: https://groups.google.com/forum/?fromgroups=#!topic/express-js/6zAebaDY6ug
Debe escribir su propio analizador, he publicado lo siguiente con más detalles en github:
https://github.com/brandid/express-xmlBodyParser
var utils = require('express/node_modules/connect/lib/utils', fs = require('fs'), xml2js = require('xml2js');
function xmlBodyParser(req, res, next) {
if (req._body) return next();
req.body = req.body || {};
// ignore GET
if ('GET' == req.method || 'HEAD' == req.method) return next();
// check Content-Type
if ('text/xml' != utils.mime(req)) return next();
// flag as parsed
req._body = true;
// parse
var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function(){
parser.parseString(buf, function(err, json) {
if (err) {
err.status = 400;
next(err);
} else {
req.body = json;
next();
}
});
});
}
entonces úsalo con
app.use (xmlBodyParser);
Respondido el 02 de enero de 13 a las 17:01
2
Si tienes esto en la configuración:
app.use (express.bodyParser ());
Y esto en tu opinión:
form(name='test',method='post',action='/messages')
input(name='msg')
Entonces esto debería funcionar:
app.post('/messages', function (req, res) {
console.log(req.body.msg);
//if it's a parameter then this will work
console.log(req.params.msg)
});
Respondido el 15 de junio de 12 a las 16:06
0
Creo que necesita configurar express para usar el bodyParser
middleware.
app.use(express.bodyParser());
ver el expreso documentación.
Dice así:
Por ejemplo, podemos PUBLICAR algunos json y repetir el json usando el middleware bodyParser que analizará los cuerpos de solicitud de json (así como otros) y colocará el resultado en req.body
req.body()
ahora debería devolver el cuerpo de publicación esperado.
¡Espero que esto ayude!
Respondido el 20 de junio de 20 a las 10:06
0
Es POSIBLE (no estoy seguro de qué depende, pero me pasó una vez, podría ser el bodyParser) que el cuerpo de la solicitud esté formateado de tal manera que sus datos JSON SE traten como una clave en un par clave-valor , con un valor correspondiente en blanco. Lo que funcionó para mí en esta situación fue extraer primero el objeto JSON y luego proceder normalmente:
var value;
for (var item in req.body)
{
var jObject = JSON.parse(item);
if (jObject.valueYouWant != undefined)
{
value = jObject.valueYouWant;
}
}
Probablemente esto sea bastante subóptimo, pero si nada más funciona (traté durante años tratando de encontrar una mejor manera y no encontré ninguna), esto podría funcionar para usted.
contestado el 27 de mayo de 13 a las 13:05
0
Estás publicando xml como puedo ver, las respuestas que obtuviste se basaron en la entrada JSON. Si desea que se muestre el contenido de su xml, procese la solicitud sin procesar:
app.post('/processXml',function (req, res)
{
var thebody = '';
req.on('data' , function(chunk)
{
thebody += chunk;
}).on('end', function()
{
console.log("body:", thebody);
});
});
Como ejemplo usando curl como su cartero:
curl -d '<myxml prop1="white" prop2="red">this is great</myxml>' -H
"Content-type: application/xml" -X POST
http://localhost:3000/processXml
Salida:
'<myxml prop1="white" prop2="red">this is great</myxml>'
Asegúrese de que su middleware de analizador corporal no se interponga: body-parser-xml procesa su objeto de solicitud sobre la marcha a un objeto json, después de lo cual ya no puede procesar su solicitud sin formato. (Y puedes adivinar quién quedó atrapado varias horas después de esto...)
Respondido el 06 de diciembre de 17 a las 10:12
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas http post express or haz tu propia pregunta.
¡Gracias! si, tengo el
bodyParser
montado, sin embargo, elreq.body
el objeto sigue vacío :o - elliotmmm interesante. ¿Está seguro de que está enviando un cuerpo de solicitud válido? ¿Has intentado enviar algo de json al
/messages
camino para probar? - norman joyner