当我使用 Express 时,我的代码是:
app.use(express.bodyParser());
我将如何获得 原始请求正文?
原文由 haitao_wu 发布,翻译遵循 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 许可协议
5 回答4.8k 阅读✓ 已解决
4 回答2.4k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
5 回答1.9k 阅读
2 回答1.3k 阅读✓ 已解决
3 回答2k 阅读
1 回答3.2k 阅读
编辑 2: body parser 模块的 1.15.2 版引入了 raw mode ,它将 body 作为 Buffer 返回。默认情况下,它还会自动处理 deflate 和 gzip 解压缩。示例用法:
默认情况下,
options
对象具有以下默认选项:如果您希望原始解析器解析
application/octet-stream
以外的其他 MIME 类型,则需要在此处进行更改。它还将支持通配符匹配,例如*/*
或*/application
。注意: 以下答案适用于 Express 4 之前的版本,其中中间件仍与框架捆绑在一起。现代的等价物是 body-parser 模块,它必须单独安装。
Express 中的
rawBody
属性曾经可用,但从 1.5.1 版本开始被删除。要获取原始请求正文,您必须在使用 bodyParser 之前放入一些中间件。您还可以 在此处 阅读有关它的 GitHub 讨论。该中间件将从实际数据流中读取,并将其存储在请求的
rawBody
属性中。然后,您可以像这样访问原始正文:编辑: 似乎这种方法和 bodyParser 拒绝共存,因为一个会在另一个之前消耗请求流,导致第二个永远不会触发
end
,因此永远不会调用next()
,并挂起您的应用程序。最简单的解决方案很可能是修改 bodyParser 的源代码,您可以在 Connect 的 JSON 解析器的 第 57 行 找到它。这就是修改后的版本。
您将在此位置找到该文件:
/node_modules/express/node_modules/connect/lib/middleware/json.js
。