How to force parse request body as plain text instead of json in Express?
In express 4.x you can use the text parser from bodyParserhttps://www.npmjs.org/package/body-parser
just add in app.js
app.use(bodyParser.text());
Also in the desired route
router.all('/',function(req,res){ console.log(req.body);})
By default bodyParser.text()
handles only text/plain. Change the type options to include */json
or */*
.
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:"*/*"}));
You can find the docs here
If you remove the use of the bodyParser()
middleware, it should be text. You can view the bodyParser
docs for more info: http://www.senchalabs.org/connect/middleware-bodyParser.html
Remove this line:
app.use(express.bodyParser());
EDIT:
Looks like you're right. You can create your own rawBody
middleware in the meantime. However, you still need to disable the bodyParser()
. Note: req.body
will still be undefined
.
Here is a 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);})
Hope this helps.