Node.js - 使用 Express 获取原始请求正文

新手上路,请多包涵

当我使用 Express 时,我的代码是:

 app.use(express.bodyParser());

我将如何获得 原始请求正文

原文由 haitao_wu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

编辑 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


注意: 以下答案适用于 Express 4 之前的版本,其中中间件仍与框架捆绑在一起。现代的等价物是 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
});

编辑: 似乎这种方法和 bodyParser 拒绝共存,因为一个会在另一个之前消耗请求流,导致第二个永远不会触发 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

原文由 hexacyanide 发布,翻译遵循 CC BY-SA 4.0 许可协议

我得到了一个与 bodyParser 配合良好的解决方案,使用 bodyParser 中的 verify 回调。在此代码中,我使用它来获取内容的 sha1 并获取原始正文。

 app.use(bodyParser.json({
    verify: function(req, res, buf, encoding) {

        // sha1 content
        var hash = crypto.createHash('sha1');
        hash.update(buf);
        req.hasha = hash.digest('hex');
        console.log("hash", req.hasha);

        // get rawBody
        req.rawBody = buf.toString();
        console.log("rawBody", req.rawBody);

    }
}));

我是 Node.js 和 express.js 的新手(从字面上看是昨天开始的!)所以我想听听对此解决方案的评论。

原文由 Tiago A. 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题