Consigue rawBody en express

Hola, estoy intentando recuperar algo de la publicación y necesito la propiedad rawBody de la solicitud entrante. ¿Cómo puedo recuperarlo?

Intenté usar Express.bodyParser () y en mi controlador de correos, estaba buscando req.rawBody, y estaba indefinido.

Incluso lo intenté con connect.bodyParser (), pero todavía no tengo suerte con eso. Me estoy volviendo indefinido para rawBody.

Estaba leyendo en el sitio stackoverflow diciendo que habían eliminado la funcionalidad rawBody, pero mencioné que es una solución rápida para agregarla a nuestro propio archivo de middleware. Soy un novato, así que no tengo ni idea de cómo lograrlo. A continuación se muestra mi fragmento de código.

/** * Module dependencies. */ var express = require('express') , connect = require('connect') , routes = require('./routes') , user = require('./routes/user') , http = require('http') , path = require('path'); var app = express(); // all environments app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); //app.use(express.bodyParser()); app.use(connect.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); // development only if ('development' == app.get('env')) { app.use(express.errorHandler()); } app.get('/', routes.index); app.get('/users', user.list); /**custom stuff**/ app.post('/upload',function(req, res){ console.log(req.header('Content-Type')); console.log(req.header('Host')); console.log(req.header('User-Agent')); console.log(req.rawBody); console.log(req.body); res.send("

Hello the response is "+req.body.username); }); /** end**/ http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); });

Cualquier ayuda con esto es muy apreciada.

Gracias.

Puedes usar tu propio software intermedio para hacer esto:

 app.use(function(req, res, next){ var data = ""; req.on('data', function(chunk){ data += chunk}) req.on('end', function(){ req.rawBody = data; next(); }) }) // Your route registration: app.get('/', function(){// whatever...}) app.post('/test', function(req, res){ console.log(req.rawBody); res.send("your request raw body is:"+req.rawBody); }) 

Estoy de vuelta otra vez: D. Después de leer connect.bodyParser, he encontrado algo: bodyParser solo analiza los datos cuyo tipo mime es: application / json, application / x-www-form-urlencoded y multipart / form-data. Así que creo que este es otro enfoque, generalmente no es elegante sino aceptable: cuando intentas enviar datos sin procesar al servidor, cambia el tipo mime a algo diferente. Como tu pregunta es una cadena, por eso elijo texto / plano como ejemplo:

 // if the request's mime type is text/plain, read it as raw data var myRawParser = function(req, res, next){ req.rawData = ''; if(req.header('content-type') == 'text/plain'){ req.on('data', function(chunk){ req.rawData += chunk; }) req.on('end', function(){ next(); }) } else { next(); } } // ... app.use(myRawParser); app.use(express.bodyParser()); // ... // Here is my test route: app.post('/test', function(req, res){ console.log('Mime type is:'+req.header('content-type')); console.log('Raw data is:'+req.rawData); console.log('Body via bodyParser is:'); console.dir(req.body); res.send('Hello!'); }) 

Lo he probado a través de rizo:

 $ curl -d 'test=hello' 127.0.0.1:3000/test // console result: Mime type is:application/x-www-form-urlencoded Raw data is: Body via bodyParser is: { test: 'hello' } 

y:

 $ curl -d 'test=hello' -H 'Content-Type:text/plain' 127.0.0.1:3000/test // console result: Mime type is:text/plain Raw data is:test=hello Body via bodyParser is: {} 

No es realmente integrar su middleware al bodyParser, solo haga que trabajen juntos.