3

我从 express 3 升级到 4,body parse 中间件已经改变,所以我使用body-parser它,它在大多数情况下看起来都很好:

var bodyParser = require('body-parser');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

但是我有一个第 3 方服务,它将调用我的特定 url 来通知消息,它​​在 express 3 中工作正常,但在 express 4 中失败,因为req.body它是空的

我调试请求头,发现Content-Typeapplication/x-www-form-urlencoded; text/html; charset=UTF-8而不是application/x-www-form-urlencoded

所以我在 curl 中进行了测试,当我删除时text/html; charset=UTF-8req.body可以准确地显示我的帖子正文。

那我该怎么办?这是第三方服务,他们没有理由更改代码,有节点方式吗?tks

4

2 回答 2

2

根据文档http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.14.17,请求标头Content-Type格式错误。所以问题是请求头有两种媒体类型,body-parser中间件处理它text/html

最后我专门为这个请求写了一个中间件,检测是否包含单词application/x-www-form-urlencoded,然后我qs.parse(buffString)暂时解决它

app.use(function(req, res, next){
  if(/^\/pay\/ali\/notify/.test(req.originalUrl)){
    req.body = req.body || {};
    if ('POST' != req.method) return next();
    var contenttype = req.headers['content-type'];
    if(!/application\/x-www-form-urlencoded/.test(contenttype)) return next();
    req._body = true;
    var buf = '';
    req.setEncoding('utf8');
    req.on('data', function(chunk){ buf += chunk });
    req.on('end', function(){
      req.body = qs.parse(buf);
      next();
    });
  }else{
    next();
  }
});
于 2015-07-14T07:32:10.293 回答
1

或者你可以强制urlencoded支付宝像 app.post('/alipay', bodyParser.urlencoded({ extended: true, type: function() {return true;} }))

于 2015-12-28T06:53:18.733 回答