Expressjs cuerpo sin procesar

¿Cómo puedo acceder al cuerpo sin procesar del objeto de solicitud que me ha enviado expressjs?

var express = require('./node_modules/express'); var app = express.createServer(); app.post('/', function(req, res) { console.log(req.body); //says 'undefined' }); app.listen(80); 

La express predeterminada no almacena los datos a menos que agregue middleware para hacerlo. La solución simple es seguir el ejemplo en la respuesta de @ Stewe a continuación, que simplemente concatenará todos los datos usted mismo. p.ej

 var concat = require('concat-stream'); app.use(function(req, res, next){ req.pipe(concat(function(data){ req.body = data; next(); })); }); 

La desventaja de esto es que ahora has movido todo el contenido del cuerpo POST a la RAM como un bloque contiguo, que puede no ser necesario. La otra opción, que vale la pena considerar, pero que depende de la cantidad de datos que necesita procesar en el cuerpo de la publicación, sería procesar los datos como una transmisión en su lugar.

Por ejemplo, con XML puede usar un analizador XML que sea compatible con el análisis de XML, ya que viene en fragmentos. Uno de esos analizadores sería XML Stream . Haz algo como esto:

 var XmlStream = require('xml-stream'); app.post('/', function(req, res) { req.setEncoding('utf8'); var xml = new XmlStream(req); xml.on('updateElement: sometag', function(element) { // DO some processing on the tag }); xml.on('end', function() { res.end(); }); }); 

Algo como esto debería funcionar:

 var express = require('./node_modules/express'); var app = express.createServer(); app.use (function(req, res, next) { var data=''; req.setEncoding('utf8'); req.on('data', function(chunk) { data += chunk; }); req.on('end', function() { req.body = data; next(); }); }); app.post('/', function(req, res) { console.log(req.body); }); app.listen(80); 

Coloque el siguiente middleware antes del middleware bodyParser. Recostackrá datos de cuerpo sin procesar en request.rawBody y no interferirá con bodyParser.

 app.use(function(req, res, next) { var data = ''; req.setEncoding('utf8'); req.on('data', function(chunk) { data += chunk; }); req.on('end', function() { req.rawBody = data; next(); }); }); app.use(express.bodyParser()); 

Al usar el middleware bodyParser.text() el cuerpo del texto se req.body en req.body .

 app.use(bodyParser.text({type: '*/*'})); 

Si desea limitar el procesamiento del cuerpo del texto a ciertas rutas o publicar tipos de contenido, puede hacerlo también.

 app.use('/routes/to/save/text/body/*', bodyParser.text({type: 'text/plain'})); //this type is actually the default app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); 

Si quieres un Buffer crudo, puedes usar bodyParse.raw() .

 app.use(bodyParser.raw({type: '*/*'})); 

Nota: esta respuesta fue probada contra el nodo v0.12.7, el expreso 4.13.2 y el analizador del cuerpo 1.13.3.

Por lo tanto, parece que bodyParser de Express solo analiza los datos entrantes, si el content-type se establece en cualquiera de los siguientes:

  1. application/x-www-form-urlencoded
  2. application/json
  3. multipart/form-data

En todos los demás casos, ni siquiera se molesta en leer los datos.

Puede cambiar la línea no. 92 de express / node_modules / connect / lib / middleware / bodyParser.js desde

 } else { next(); } 

A:

 } else { var data=''; req.setEncoding('utf8'); req.on('data', function(chunk) { data += chunk; }); req.on('end', function() { req.rawBody = data; next(); }); } 

Y luego, lea req.rawBody desde su código.

Si tiene problemas con las soluciones anteriores que interfieren con las solicitudes de envío normales, algo como esto podría ayudar:

 app.use (function(req, res, next) { req.rawBody = ''; req.setEncoding('utf8'); req.on('data', function(chunk) { req.rawBody += chunk }); }); 

Más información y fuente: https://github.com/visionmedia/express/issues/897#issuecomment-3314823

 app.use(bodyParser.json({ verify: function (req, res, buf, encoding) { req.rawBody = buf; } })); app.use(bodyParser.urlencoded({ extended: false, verify: function (req, res, buf, encoding) { req.rawBody = buf; } })); 

Si quieres el cuerpo como un buffer:

 var rawParser = function(req, res, next) { var chunks = []; req.on('data', function(chunk) { chunks.push(chunk) }); req.on('end', function() { req.body = Buffer.concat(chunks); next(); }); } 

o

 var rawParser = bodyParser.raw({type: '*/*'}); 

y entonces:

 app.put('/:name', rawParser, function(req, res) { console.log('isBuffer:', Buffer.isBuffer(req.body)); }) 

o para todas las rutas:

 app.use(bodyParser.raw({type: '*/*'})); 

TENGA CUIDADO con esas otras respuestas, ya que no funcionarán correctamente con bodyParser si también está buscando admitir json, urlencoded, etc. Para que funcione con bodyParser, debe condicionar su controlador para que solo se registre en el encabezado Content-Type ( s) te importa, al igual que bodyParser sí mismo.

Para obtener el contenido de cuerpo sin procesar de una solicitud con Content-Type: "text/xml" en req.rawBody , puede hacer lo siguiente:

 app.use(function(req, res, next) { var contentType = req.headers['content-type'] || '' , mime = contentType.split(';')[0]; if (mime != 'text/xml') { return next(); } var data = ''; req.setEncoding('utf8'); req.on('data', function(chunk) { data += chunk; }); req.on('end', function() { req.rawBody = data; next(); }); }); 

¡Parece que esto se ha vuelto mucho más fácil ahora !

El módulo analizador de cuerpo ahora puede analizar datos en bruto y de texto, lo que hace que la tarea sea única :

 app.use(bodyParser.text({type: 'text/plain'})) 

O

 app.use(bodyParser.raw({type: 'application/binary'})) 

Ambas líneas simplemente llenan la propiedad del body , por lo tanto, obtenga el texto con res.body . bodyParser.text() te dará la cadena UTF8 mientras bodyParser.raw() te dará

Este es el código completo de texto / datos simples:

 var express = require('express') var bodyParser = require('body-parser') var app = express() app.use(bodyParser.text({type: 'text/plain'})) app.post('/', function (req, res, next) { console.log('body:\n' + req.body) res.json({msg: 'success!'}) next() }) 

Consulte aquí para obtener la documentación completa: https://www.npmjs.com/package/body-parser

Usé express 4.16 y body-parser 1.18