uni-app 云函数URL化后接收encodeURI后的POST会报错
uni-app 云函数URL化后接收encodeURI后的POST会报错
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
uniCloud/App | 未知 | 未知 |
操作步骤:
uni.request({ url:realURL, method:"POST", data: encodeURI( JSON.stringify({a:1,b:100}))})
预期结果:
正常进入云函数代码
实际结果:
代码完全无法执行
bug描述:
无法进入云函数的逻辑,会直接框架返回报错:{"success":false,"error":{"code":"","message":"Unexpected token % in JSON at position 0, check bodyParser config"}}
试过了如果不做encodeURI就是正常的
更多关于uni-app 云函数URL化后接收encodeURI后的POST会报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html
4 回复
另外我也尝试了用别的引擎发这条消息发现不会引起报错,只有uniapp会有问题····
更多关于uni-app 云函数URL化后接收encodeURI后的POST会报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你这样encode是想发送什么请求呢?content-type要使用什么?application/json还是text/plain?
回复 DCloud_uniCloud_WYQ: 后台要求的所有数据要encodeURI,content-type设置下好像可以了0 0
这个问题的原因在于数据编码和解析的配置不匹配。
当使用encodeURI(JSON.stringify())
对POST数据进行双重编码时,云函数端默认的bodyParser中间件会尝试将请求体解析为JSON。但由于数据已经被URI编码,解析器遇到了%
字符(URI编码的起始标记),导致JSON解析失败。
解决方案:
- 移除encodeURI(推荐) 直接发送JSON字符串即可:
uni.request({
url: realURL,
method: "POST",
data: JSON.stringify({a:1, b:100})
})
- 修改云函数配置 在云函数的package.json中配置bodyParser处理原始数据:
{
"dependencies": {},
"cloudfunction-config": {
"bodyParser": false
}
}
然后在云函数中手动解析:
exports.main = async (event) => {
let body = event.body
if (event.isBase64Encoded) {
body = Buffer.from(body, 'base64').toString('utf-8')
}
const data = JSON.parse(decodeURIComponent(body))
// 处理业务逻辑
}