Corpo grezzo Expressjs

Come posso accedere al corpo grezzo dell’object richiesta che mi è stato dato da 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); 

L’ express predefinita express non memorizza dati nel buffer a meno che non si aggiunga il middleware. La soluzione semplice è seguire l’esempio nella risposta di @ Stewe qui sotto, che concatenerebbe tutti i dati da solo. per esempio

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

Lo svantaggio di questo è che ora hai spostato tutto il contenuto del corpo POST nella RAM come un blocco contiguo, che potrebbe non essere necessario. L’altra opzione, che vale la pena considerare, ma dipende dalla quantità di dati che è necessario elaborare nel corpo del post, è quella di elaborare i dati come stream.

Ad esempio, con XML è ansible utilizzare un parser XML che supporta l’analisi dell’XML in ingresso come blocchi. Uno di questi parser sarebbe XML Stream . Fai qualcosa del genere:

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

Qualcosa di simile dovrebbe funzionare:

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

Metti il ​​seguente middleware prima del middleware bodyParser. Raccoglierà i dati del corpo grezzo in request.rawBody e non 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()); 

L’utilizzo del middleware bodyParser.text() inserirà il corpo del testo in req.body .

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

Se vuoi limitare l’elaborazione del corpo del testo a determinati percorsi o pubblicare tipi di contenuto, puoi farlo anche tu.

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

Se si desidera un Buffer raw, è ansible utilizzare bodyParse.raw() .

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

Nota: questa risposta è stata testata contro il nodo v0.12.7, express 4.13.2 e body-parser 1.13.3.

Quindi, sembra che bodyParser di Express analizzi solo i dati in arrivo, se il content-type è impostato su uno dei seguenti:

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

In tutti gli altri casi, non si preoccupa nemmeno di leggere i dati.

È ansible modificare la linea n. 92 di express / node_modules / connect / lib / middleware / bodyParser.js da

 } else { next(); } 

A:

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

E poi, leggi req.rawBody dal tuo codice.

Se hai problemi con le soluzioni di cui sopra che interferiscono con le normali richieste post, qualcosa del genere potrebbe aiutare:

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

Maggiori informazioni e fonte: 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; } })); 

Se vuoi il corpo come 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: '*/*'}); 

e poi:

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

o per tutte le rotte:

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

FATE ATTENZIONE a quelle altre risposte poiché non funzioneranno correttamente con bodyParser se state cercando di supportare anche json, urlencoded, ecc. Per farlo funzionare con bodyParser dovreste condizionare il gestore a registrarsi solo sull’intestazione Content-Type ( s) a cui tieni, proprio come fa BodyParser.

Per ottenere il contenuto del corpo grezzo di una richiesta con Content-Type: "text/xml" in req.rawBody puoi fare:

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

Sembra che questo sia diventato molto più facile ora !

Il modulo body-parser è ora in grado di analizzare i dati grezzi e di testo, il che rende l’attività un one-liner :

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

O

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

Entrambe le linee riempiono semplicemente la proprietà del body , quindi prendi il testo con res.body . bodyParser.text() ti darà la stringa UTF8 mentre bodyParser.raw() ti darà

Questo è il codice completo per i dati di testo / semplici:

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

Vedi qui per la documentazione completa: https://www.npmjs.com/package/body-parser

Ho usato express 4.16 e parser del corpo 1.18