我正在像这样使用nodejs + Express(v3):
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 });
我检查了请求标头,但缺少内容类型。即使“ Content-Type”是“ text / plain”,它似乎也将解析为JSON。无论如何,有没有告诉中间件总是将正文解析为纯文本字符串而不是json?以前req具有req.rawBody此功能的早期版本可以解决此问题,但现在不再存在。在Express中强制将正文解析为纯文本/字符串的最简单方法是什么?
req
req.rawBody
如果删除bodyParser()中间件的使用,则应该为文本。您可以查看bodyParser文档以获取更多信息:http : //www.senchalabs.org/connect/middleware- bodyParser.html
bodyParser()
bodyParser
删除此行:
app.use(express.bodyParser());
看起来你是对的。同时,您可以创建自己的rawBody中间件。但是,您仍然需要禁用bodyParser()。注意:req.body仍然会undefined。
rawBody
req.body
undefined
这是一个演示:
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); })
希望这可以帮助。