web-dev-qa-db-fra.com

Comment forcer le corps de la requête d'analyse en texte brut au lieu de json dans Express?

J'utilise nodejs + Express (v3) comme ceci:

app.use(express.bodyParser());
app.route('/some/route', function(req, res) {
  var text = req.body; // I expect text to be a string but it is a JSON
});

J'ai vérifié les en-têtes de demande et le type de contenu est manquant. Même si "Content-Type" est "text/plain", il est analysé comme un JSON, semble-t-il. Est-il possible de demander au middleware de toujours analyser le corps comme une chaîne de texte en clair au lieu de json? Les versions précédentes de req avaient req.rawBody pour résoudre ce problème, mais ce n’est plus le cas. Quel est le moyen le plus simple de forcer le corps d'analyse en texte brut/chaîne dans Express? 

32
pathikrit

Si vous supprimez l'utilisation du middleware bodyParser(), il doit s'agir d'un texte. Vous pouvez consulter la documentation bodyParser pour plus d'informations: http://www.senchalabs.org/connect/middleware-bodyParser.html

Supprimer cette ligne:

app.use(express.bodyParser());

MODIFIER:

On dirait que tu as raison. Vous pouvez créer votre propre middleware rawBody en attendant. Cependant, vous devez toujours désactiver la bodyParser(). Remarque: req.body sera toujours undefined.

Voici une démo:

app.js

var express = require('express')
  , http = require('http')
  , path = require('path')
  , util = require('util');

var app = express();

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

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.use(rawBody);
  //app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
});

app.post('/test', function(req, res) {
  console.log(req.is('text/*'));
  console.log(req.is('json'));
  console.log('RB: ' + req.rawBody);
  console.log('B: ' + JSON.stringify(req.body));
  res.send('got it');
});

http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

test.js

var request = require('request');

request({
  method: 'POST',
  uri: 'http://localhost:3000/test',
  body: {'msg': 'secret'},
  json: true
}, function (error, response, body) {
  console.log('code: '+ response.statusCode);
  console.log(body);
})

J'espère que cela t'aides.

20
JP Richardson

Dans Express 4.x, vous pouvez utiliser l'analyseur de texte de bodyParser https://www.npmjs.org/package/body-parser

il suffit d'ajouter dans app.js 

app.use(bodyParser.text());

Aussi dans l'itinéraire souhaité

router.all('/',function(req,res){
    console.log(req.body);

})
24
Nacho

Par défaut, bodyParser.text() ne gère que text/plain. Modifiez les options de type pour inclure */json ou */*.

app.use('/some/route', bodyParser.text({type: '*/*'}), function(req, res) {
  var text = req.body; // I expect text to be a string but it is a JSON
});

//or more generally:
app.use(bodyParser.text({type:"*/*"}));

Vous pouvez trouver les docs ici

24
Raghu

Vous pouvez utiliser le middleware plainTextParser ( https://www.npmjs.com/package/plaintextparser ).

let plainTextParser = require('plainTextParser');
app.use(plainTextParser());

ou

app.post(YOUR_ROUTE, plainTextParser, function(req, res) {             
  let text = req.text;

  //DO SOMETHING....
}); 
3
Carlos

Je l'ai fait:

router.route('/')
.post(function(req,res){
    var chunk = '';

    req.on('data', function(data){
        chunk += data; // here you get your raw data.
    })        

    req.on('end', function(){

        console.log(chunk); //just show in console
    })
    res.send(null);

})
1
vpmayer

Assurez-vous que la version de express et bodyParser a été mise à niveau vers les versions appropriées. Express ˜4.x et bodyParser 1.18.x. Ça devrait le faire. Avec cela en place ce qui suit devrait fonctionner 

app.use (bodyParser.text ());

0
crazyDiamond