当我使用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

Node.js相关问答推荐

Node.js PNG缓冲区获取未知图像格式错误

Mongoose-不会更新数组中的属性值

函数声明中的异步在没有等待的函数中做什么?

当 Got 包因错误 JSON 崩溃时如何获取响应文本?

为什么我的 Node.js 应用程序在登录时无法正确验证密码(使用 Passport-local 和 bcryptjs)?

如何使用mongoose引用不在项目中的模型

如何使用 Remix 仅在客户端呈现组件?

Electron 模板(Typescript + Webpack)中的这个 Electron Forge ERROR 是什么?

Express.js cookie setter 的 Domain 属性:如何与 *多个 * 域共享 cookie?

类型中缺少属性,该类型是由类实现的接口

适用于 Windows 的 NVM 无法正常工作?

node.js 是否支持yields ?

安全沙箱并执行用户提交的 JavaScript?

如何解决'npm应该在 node repl之外运行,在你的普通shell中'

gyp WARN EACCES 用户root没有访问开发目录的权限

Passport 的 req.isAuthenticated 总是返回 false,即使我硬编码 done(null, true)

fs.createWriteStream 不会立即创建文件?

使用 Monit 而不是基本的 Upstart 设置有什么好处?

在 Node.js 中混合使用 JavaScript 和 TypeScript

NodeJS:如何调试检测到 EventEmitter 内存泄漏.添加了 11 个侦听器