body-parser получает пустое тело, когда content-type имеет несколько значений



Я обновляю с express 3 до 4, промежуточное ПО для разбора тела изменилось, поэтому я использую body-parser, и это выглядит нормально в большинстве ситуаций:



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

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


Но у меня есть сторонний сервис, который вызовет один из моих конкретных url для уведомления сообщений, он прекрасно работает в express 3, но не удалось в express 4, потому что req.body пусто



Я отлаживаю заголовок запроса, обнаружив, что Content-Type является application/x-www-form-urlencoded; text/html; charset=UTF-8, а не application/x-www-form-urlencoded



Поэтому я проверил в curl, когда я удаляю text/html; charset=UTF-8, req.body может показать мое тело столба именно так.



Так что же мне делать тогда? это сторонний сервис, это не причина для них менять свой код, есть ли способ узла? tks

577   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();
  }
});

Или вы можете просто заставить urlencoded для Alipay, как app.post('/alipay', bodyParser.urlencoded({ extended: true, type: function() {return true;} }))

Comments

    Ничего не найдено.