Extracción de datos POST con Express

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.??
});

preguntado el 12 de junio de 12 a las 18:06

5 Respuestas

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

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

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

¡Gracias! si, tengo el bodyParser montado, sin embargo, el req.body el objeto sigue vacío :o - elliot

mmm 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

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

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 or haz tu propia pregunta.