62 votes

Corps brut Expressjs

Comment puis-je accéder au corps brut de l'objet de la requête qui m'est donné par 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);

58voto

stewe Points 14623

Quelque chose comme ceci devrait fonctionner :

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

44voto

Zugwalt Points 3783

Utilisation de la bodyParser.text() Le middleware placera le corps du texte dans req.body .

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

Si vous souhaitez limiter le traitement du corps de texte à certains itinéraires ou types de contenu de message, vous pouvez également le faire.

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 vous voulez une Buffer vous pouvez utiliser bodyParse.raw() .

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

Note : cette réponse a été testée avec node v0.12.7, express 4.13.2 et body-parser 1.13.3.

29voto

Andy Points 1448

Mettez le middleware suivant avant le middleware bodyParser. Il collectera les données brutes du corps dans request.rawBody et n'interférera pas avec 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());

22voto

loganfsmyth Points 25483

Défaut express ne met pas les données en mémoire tampon, à moins que vous n'ajoutiez un intergiciel pour le faire. La solution simple consiste à suivre l'exemple de la réponse de @Stewe ci-dessous, ce qui revient à concaténer toutes les données vous-même. Par ex.

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

L'inconvénient est que vous avez maintenant déplacé tout le contenu du corps du POST dans la RAM sous forme d'un bloc contigu, ce qui n'est peut-être pas nécessaire. L'autre option, qui mérite d'être envisagée mais qui dépend de la quantité de données que vous devez traiter dans le corps du message, consiste à traiter les données sous forme de flux.

Par exemple, avec le XML, vous pouvez utiliser un analyseur XML qui prend en charge l'analyse du XML lorsqu'il arrive sous forme de morceaux. Un tel analyseur serait Flux XML . Vous faites quelque chose comme ça :

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

15voto

poordeveloper Points 1886
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;
    }
}));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X