当我使用Express时,我的代码是:
app.use(express.bodyParser());
我怎样才能拿到raw request body分?
当我使用Express时,我的代码是:
app.use(express.bodyParser());
我怎样才能拿到raw request body分?
Edit 2: body parser模块的1.15.2版引入了raw mode,它将body作为Buffer返回.默认情况下,它还会自动处理deflate和gzip解压缩.用法示例:
var bodyParser = require('body-parser');
app.use(bodyParser.raw(options));
app.get(path, function(req, res) {
// req.body is a Buffer object
});
默认情况下,options
对象具有以下默认选项:
var options = {
inflate: true,
limit: '100kb',
type: 'application/octet-stream'
};
如果希望原始解析器解析application/octet-stream
以外的其他MIME类型,则需要在此处进行更改.它还将支持通配符匹配,例如*/*
或*/application
.
Note:以下答案适用于Express 4之前的版本,其中中间件仍然与框架Bundle 在一起.现代的等效设备是body-parser模块,必须单独安装.
Express中的rawBody
属性曾经可用,但从1.5.1版开始删除.要获得原始请求主体,必须在使用bodyParser之前加入一些中间件.你也可以阅读GitHub关于它的讨论.
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
req.on('end', function() {
next();
});
});
app.use(express.bodyParser());
该中间件将从实际数据流中读取数据,并将其存储在请求的rawBody
属性中.然后,您可以像这样访问原始身体:
app.post('/', function(req, res) {
// do something with req.rawBody
// use req.body for the parsed body
});
Edit:这个方法和bodyParser似乎拒绝共存,因为其中一个会先使用请求流,导致第二个永远不会触发end
,因此永远不会调用next()
,并挂起应用程序.
最简单的解决方案很可能是修改bodyParser的源代码,您可以在Connect的line 57个JSON解析器中找到它.这就是修改后的版本.
var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function() {
req.rawBody = buf;
var first = buf.trim()[0];
...
});
您可以在以下位置找到该文件:
/node_modules/express/node_modules/connect/lib/middleware/json.js