Comment forcer l'analyse du corps de la requête 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 requête et le type de contenu est manquant. Même si " Content-Type "est" text/plain", il est en train d'analyser en tant que JSON, il semble. Est - il de toute façon de dire au middleware d'analyser toujours le corps comme une chaîne de texte brut au lieu de json? Les versions antérieures de req avaient l'habitude d'avoir req.rawBody qui contournerait ce problème mais maintenant ce n'est plus le cas. Quel est le moyen le plus simple de forcer l'analyse du corps en tant que texte brut/chaîne dans Express?

32
demandé sur pathikrit 2012-09-10 07:57:40

6 réponses

Si vous supprimez l'utilisation du middleware bodyParser(), il devrait s'agir de texte. Vous pouvez consulter les documents 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 entre-temps. Cependant, vous devez toujours désactiver le bodyParser(). Remarque: req.body sera toujours undefined.

Voici un 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 aide.

18
répondu JP Richardson 2012-09-10 15:46:30

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 l'application.js

app.use(bodyParser.text());

Également dans l'itinéraire souhaité

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

})
20
répondu Nacho 2014-11-27 18:14:51

Par défaut bodyParser.text() gère uniquement le texte/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

19
répondu Raghu 2016-07-21 20:36:08

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

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

Ou

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

  //DO SOMETHING....
}); 
3
répondu Carlos 2016-09-01 17:05:19

, 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
répondu vpmayer 2017-07-21 16:41:44

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

App.utilisation (bodyParser.texte ());

0
répondu crazyDiamond 2018-01-23 01:58:59