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解析失败。

解决方案:

  1. 移除encodeURI(推荐) 直接发送JSON字符串即可:
uni.request({
  url: realURL,
  method: "POST",
  data: JSON.stringify({a:1, b:100})
})
  1. 修改云函数配置 在云函数的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))
  // 处理业务逻辑
}
回到顶部