Obtenez rawBody dans Express

Bonjour, j’essaie de récupérer quelque chose de la publication et j’ai besoin de la propriété rawBody de la demande entrante. Comment puis-je le récupérer?

J’ai essayé d’utiliser express.bodyParser () et, dans mon gestionnaire de publication, je cherchais req.rawBody, qui n’était pas défini.

Je l’ai même essayé avec connect.bodyParser (), mais je n’ai toujours pas eu de chance avec ça. Je deviens indéfini pour rawBody.

Je lisais sur le site stackoverflow en disant qu’ils avaient supprimé la fonctionnalité rawBody, mais que c’était une solution rapide pour l’append à notre propre fichier de middleware. Je suis un débutant, donc je ne sais pas comment y parvenir. Ci-dessous, mon extrait de code.

/** * 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')); });

Toute aide à cet égard est très appréciée.

Je vous remercie.

Vous pouvez utiliser votre propre middleware pour faire ceci:

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

Je suis de retour: D. Après avoir lu connect.bodyParser, j’ai trouvé quelque chose: BodyParser n’parsing que les données dont le type mime est l’un des suivants: application / json, application / x-www-form-urlencoded et multipart / form-data. Je pense donc que c’est une autre approche; elle n’est pas généralement élégante, mais acceptable: lorsque vous essayez d’envoyer des données brutes au serveur, changez le type MIME en un autre. Comme votre question est une chaîne, j’ai donc choisi text / plain comme exemple:

 // 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!'); }) 

Je l’ai testé via curl:

 $ 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' } 

et:

 $ 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: {} 

Ce n’est pas réellement intégrer votre middleware à bodyParser, mais simplement les faire fonctionner ensemble.