如何访问expressjs给我的请求对象的原始主体?
var express = require('./node_modules/express');
var app = express.createServer();
app.post('/', function(req, res)
{
console.log(req.body); //says 'undefined'
});
app.listen(80);
答案 0 :(得分:51)
这样的事情应该有效:
var express = require('./node_modules/express');
var app = express.createServer();
app.use (function(req, res, next) {
var data='';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.body = data;
next();
});
});
app.post('/', function(req, res)
{
console.log(req.body);
});
app.listen(80);
答案 1 :(得分:31)
使用bodyParser.text()
中间件会将文本正文放在req.body
。
app.use(bodyParser.text({type: '*/*'}));
如果您想将文本正文处理限制为某些路线或发布内容类型,您也可以这样做。
app.use('/routes/to/save/text/body/*', bodyParser.text({type: 'text/plain'})); //this type is actually the default
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
如果您想要原始Buffer
,可以使用bodyParse.raw()
。
app.use(bodyParser.raw({type: '*/*'}));
注意:这个答案是针对节点v0.12.7,表达4.13.2和正文解析器1.13.3进行测试的。
答案 2 :(得分:26)
将以下中间件放在bodyParser中间件之前。它将在request.rawBody中收集原始身体数据,并且不会干扰bodyParser。
app.use(function(req, res, next) {
var data = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
next();
});
});
app.use(express.bodyParser());
答案 3 :(得分:15)
除非您添加中间件,否则默认express
不会缓冲数据。简单的解决方案是遵循下面@ Stewe的答案中的示例,这将自己连接所有数据。 e.g。
var concat = require('concat-stream');
app.use(function(req, res, next){
req.pipe(concat(function(data){
req.body = data;
next();
}));
});
这样做的缺点是,您现在已将所有POST正文内容作为连续的块移动到RAM中,这可能不是必需的。另一个值得考虑的选项,但取决于您需要在帖子正文中处理多少数据,而是将数据作为流处理。
例如,使用XML,您可以使用支持解析XML的XML解析器,因为它以块的形式出现。一个这样的解析器将是XML Stream。你做这样的事情:
var XmlStream = require('xml-stream');
app.post('/', function(req, res) {
req.setEncoding('utf8');
var xml = new XmlStream(req);
xml.on('updateElement: sometag', function(element) {
// DO some processing on the tag
});
xml.on('end', function() {
res.end();
});
});
答案 4 :(得分:7)
因此,如果将content-type
设置为以下任一项,Express的bodyParser似乎只解析传入的数据:
application/x-www-form-urlencoded
application/json
multipart/form-data
在所有其他情况下,它甚至都不打算阅读数据。
您可以更改行号。来自
的express / node_modules / connect / lib / middleware / bodyParser.js的92} else {
next();
}
要:
} else {
var data='';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
next();
});
}
然后,从您的代码中阅读req.rawBody
。
答案 5 :(得分:6)
app.use(bodyParser.json({
verify: function (req, res, buf, encoding) {
req.rawBody = buf;
}
}));
app.use(bodyParser.urlencoded({
extended: false,
verify: function (req, res, buf, encoding) {
req.rawBody = buf;
}
}));
答案 6 :(得分:5)
如果您在上述解决方案遇到干扰正常发布请求时遇到问题,可能会有所帮助:
app.use (function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) { req.rawBody += chunk });
});
更多信息&来源:https://github.com/visionmedia/express/issues/897#issuecomment-3314823
答案 7 :(得分:3)
请小心处理其他答案,因为如果您还希望同时支持json,urlencoded等,它们将无法正常使用bodyParser。要使其与bodyParser一起使用,您应该将处理程序设置为仅在你关心的Content-Type
标题,就像bodyParser本身一样。
要将Content-Type: "text/xml"
的{{1}}请求的原始内容转换为req.rawBody
,您可以执行以下操作:
app.use(function(req, res, next) {
var contentType = req.headers['content-type'] || ''
, mime = contentType.split(';')[0];
if (mime != 'text/xml') {
return next();
}
var data = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
next();
});
});
答案 8 :(得分:3)
如果你想将身体作为缓冲:
var rawParser = function(req, res, next) {
var chunks = [];
req.on('data', function(chunk) {
chunks.push(chunk)
});
req.on('end', function() {
req.body = Buffer.concat(chunks);
next();
});
}
或
var rawParser = bodyParser.raw({type: '*/*'});
然后:
app.put('/:name', rawParser, function(req, res) {
console.log('isBuffer:', Buffer.isBuffer(req.body));
})
或所有路线:
app.use(bodyParser.raw({type: '*/*'}));
答案 9 :(得分:3)
现在看来现在变得更容易了!
body-parser模块现在能够解析原始数据和文本数据,这使得任务成为单行:
app.use(bodyParser.text({type: 'text/plain'}))
或强>
app.use(bodyParser.raw({type: 'application/binary'}))
这两行只是填充body
属性,因此请使用res.body
获取文本。
bodyParser.text()
将为您提供UTF8字符串,bodyParser.raw()
将为您提供
这是text / plain数据的完整代码:
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
app.use(bodyParser.text({type: 'text/plain'}))
app.post('/', function (req, res, next) {
console.log('body:\n' + req.body)
res.json({msg: 'success!'})
next()
})
请参阅此处获取完整文档:
conversations.members
我使用了express 4.16和body-parser 1.18