【问题标题】:How to access the raw body of the request before bodyparser?如何在bodyparser之前访问请求的原始正文?
【发布时间】:2015-05-12 13:02:31
【问题描述】:

我正在编写一个自定义中间件,它会为每个请求生成一个加密签名(它与 AWS API v4 使用的身份验证机制非常相似)。为了正确生成此签名,我必须获取 HTTP 请求的整个 raw 正文。

我也在使用 BodyParser,它是在我的自定义中间件之后注册的

我的自定义中间件可以这样表示:

// libs/simplifiedSignatureCheckerMiddleware.js

module.exports = function (req, res, next){

// simple and fast hashing stuff

var payload = '';
req.on('data', function(chunk) { payload += chunk }, null);
req.on('end', function(){

    // hmac stuff

    console.log(payload);

    var ok = true; // ...

    if(ok)
        next();
    else
        next("Bad")
});

}

这是我在服务器上使用它的方式。

// simpleServer.js

// BASE SETUP
// =============================================================================
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var jsonStream = require('express-jsonstream');
var nconf = require('nconf');
var https = require('https');
var fs = require('fs');

// load configurations
nconf.argv().env();
nconf.file({file: 'config.json'});

app.use(require('./libs/simplifiedSignatureCheckerMiddleware'));

// configure app to use bodyParser()
// this will let us get the data from a POST
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(jsonStream());

// ROUTES FOR API
// =============================================================================
var router = express.Router();

router.post('/api/', function (req, res) {
    var param1 = req.body.param1 || "";
    var param2 = req.body.param2 || "";

    res.json({message: 'welcome', one: param1, two: param2 });
});
// REGISTER ROUTES
app.use(router);

// START THE SERVER
// =============================================================================

https.createServer({
    key: fs.readFileSync('./key.pem'),
    cert: fs.readFileSync('./cert.pem')
}, app).listen(nconf.get('http:port'));

console.log("APIs listening on port " + nconf.get('http:port'));

如您所见,中间件已成功将原始正文写入控制台,但注册的路由永远不会处理请求,连接将永远挂起。

你知道如何解决这个问题吗?

提前致谢。

【问题讨论】:

  • 您正在耗尽中间件中的请求流。当它到达 bodyparser 时,它现在会挂起,因为没有可供它读取的流,所以它永远不会调用下一个。 stackoverflow.com/questions/18710225/…stackoverflow.com/questions/9920208/expressjs-raw-body/…
  • 我知道。问题在于,唯一可行的解​​决方案似乎是修改 bodyParser 源代码,以便在 Response 中重新引入 rawBody 字段。第一个解决方案导致了这一点,而第二个现在是不可行的。
  • 不幸的是,这似乎是大多数人所做的。
  • 另请注意bodyParser 有一个verify 选项,您可以就地进行加密验证。

标签: node.js express


【解决方案1】:

好的,由于解决这个问题的唯一可行方法似乎是修改bodyParser的原始源代码,所以我已经fork了。

https://github.com/emanuelecasadio/body-parser-rawbody

此分叉将请求的原始主体公开为名为 rawBody 的字段。如您所见,只有一行额外的代码。

你可以使用npm install body-parser-rawbody来安装它。

编辑

另一种选择是像这样使用 bodyParser,正如 dougwilson 所说:https://github.com/expressjs/body-parser/issues/83#issuecomment-80784100

app.use(bodyParser.json({verify:function(req,res,buf){req.rawBody=buf}}))

我没有亲自尝试过这个选项,我不知道它是否有效。

【讨论】:

  • 我希望我能 +100 这个答案!
  • 对于将来看到此内容的任何人,req.rawBody = buf.toString() 是您想要的。
猜你喜欢
  • 2015-10-19
  • 2015-11-20
  • 2020-07-19
  • 2018-11-27
  • 2010-11-06
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
相关资源
最近更新 更多