wake-up-neo.net

Wie erzwinge ich den Parse-Request-Body als einfachen Text anstelle von Json in Express?

Ich verwende nodejs + Express (v3) wie folgt:

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

Ich habe die Anforderungsheader überprüft und der Inhaltstyp fehlt. Selbst wenn "Content-Type" "text/plain" ist, analysiert es als JSON, wie es scheint. Gibt es sowieso der Middleware zu sagen, dass sie den Body immer als einfachen Textstring anstelle von Json analysiert? Frühere Versionen von req verwendeten req.rawBody, die dieses Problem umgehen würden, jetzt aber nicht mehr. Was ist der einfachste Weg, einen Parse-Body als einfachen Text/String in Express zu erzwingen? 

32
pathikrit

Wenn Sie die Verwendung der bodyParser()-Middleware entfernen, sollte es sich um Text handeln. Sie können die bodyParser-Dokumentation für weitere Informationen anzeigen: http://www.senchalabs.org/connect/middleware-bodyParser.html

Entfernen Sie diese Zeile:

app.use(express.bodyParser());

BEARBEITEN:

Sieht so aus, als hättest du recht. Sie können in der Zwischenzeit Ihre eigene rawBody-Middleware erstellen. Sie müssen jedoch weiterhin die bodyParser() deaktivieren. Hinweis: req.body bleibt weiterhin undefined.

Hier ist eine Demo:

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

Hoffe das hilft.

20
JP Richardson

In Express 4.x können Sie den Textparser von bodyParser verwenden https://www.npmjs.org/package/body-parser

fügen Sie einfach app.js hinzu 

app.use(bodyParser.text());

Auch in der gewünschten Route

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

})
24
Nacho

Standardmäßig behandelt bodyParser.text() nur Text/Plain. Ändern Sie die Typoptionen so, dass sie */json oder */* enthalten.

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

Sie finden die Dokumente hier

24
Raghu

Sie können die plainTextParser-Middleware ( https://www.npmjs.com/package/plaintextparser ) verwenden.

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

oder

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

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

Ich habs geschafft:

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

Express versteht unter Inhaltstypen, wie ein Körper dekodiert wird. Es muss spezielle Decoder in der Middleware haben, die in die Bibliothek eingebettet sind von 4.x:

app.use(express.text())
app.use(express.json())
0
dimpiax

Stellen Sie sicher, dass die Version von express und bodyParser auf die entsprechenden Versionen aktualisiert wurde. Express ˜4.x und bodyParser ˜1.18.x. Das sollte es tun. Damit sollte Folgendes funktionieren 

app.use (bodyParser.text ());

0
crazyDiamond