当我使用Express时,我的代码是:
app.use(express.bodyParser());
我将如何获得 原始请求正文 ?
编辑2: 主体解析器模块的1.15.2版引入了原始模式,该模式将主体作为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对象具有以下默认选项:
options
var options = { inflate: true, limit: '100kb', type: 'application/octet-stream' };
如果您希望原始解析器解析以外的其他MIME类型application/octet- stream,则需要在此处进行更改。它还将支持通配符匹配,例如*/*或*/application。
application/octet- stream
*/*
*/application
注意: 以下答案适用于Express 4之前的版本,其中中间件仍与框架捆绑在一起。现代等效项是主体解析器模块,必须单独安装。
rawBodyExpress中的属性曾经可用,但是从1.5.1版开始就删除了。要获取原始请求主体,必须在使用bodyParser之前放入一些中间件。您还可以在此处阅读有关GitHub的讨论。
rawBody
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 });
编辑: 似乎此方法和bodyParser拒绝共存,因为一个方法将在另一个方法之前消耗请求流,从而导致第二个方法永远不会触发end,从而永远不会调用next(),并挂起您的应用程序。
end
next()
最简单的解决方案很可能是修改bodyParser的源,您可以在Connect的JSON解析器的第57行中找到该源。这就是修改后的版本。
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。
/node_modules/express/node_modules/connect/lib/middleware/json.js