gpt4 book ai didi

express - 当内容类型有多个值时,正文解析器获取空正文

转载 作者:行者123 更新时间:2023-12-01 13:51:29 24 4
gpt4 key购买 nike

我从 express 3 升级到 4,body parse 中间件已经改变,所以我使用 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-Typeapplication/x-www-form-urlencoded;文本/html; charset=UTF-8 而不是 application/x-www-form-urlencoded

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

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

最佳答案

根据文档 http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.14.17Content-Type 的请求 header 格式错误。所以问题是请求 header 有两种媒体类型,而 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();
}
});

关于express - 当内容类型有多个值时,正文解析器获取空正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31308436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com