弈凌
弈凌
  • 发布:2023-02-23 10:03
  • 更新:2023-03-21 13:26
  • 阅读:622

【报Bug】uni.request long类型精度丢失

分类:uni-app

产品分类: uniapp/H5

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: Windows 11 家庭中文版 21H2

HBuilderX类型: 正式

HBuilderX版本号: 3.6.18

浏览器平台: Chrome

浏览器版本: 95内核

项目创建方式: HBuilderX

操作步骤:

uni.request long类型精度丢失

预期结果:

uni.request long类型精度丢失

实际结果:

uni.request long类型精度丢失

bug描述:

问题描述

uni.request long类型精度丢失,这是一个常见的问题,vue都有这个问题。但uni.request中请问有解决方案么,谢谢。

关联问题

https://ask.dcloud.net.cn/question/99666

https://ask.dcloud.net.cn/question/97586

解决方案(问题已解决)

uni.addInterceptor('request', {  
    returnValue(args) {  
        args.then((res)=> {  
            res.data = "你要修改的值。"  
        })  
    }  
})
2023-02-23 10:03 负责人:无 分享
已邀请:
DCloud_UNI_WZF

DCloud_UNI_WZF

后端发送给前端的时候把对应数值转为字符串传输或者使用json-bigint将接收到的超限数字转为字符串
拿到字符串如果需要计算,对字符串进行按位计算或转为 bigInt

  • 弈凌 (作者)

    你好,接口是外部的系统,只能前端通过json-bigint方式处理,我想尝试 uni.addInterceptor('request') 这里试下 json-bigint 处理,但在如何引用 json-bigint ts包给卡住了,能提点下么,谢谢。

    2023-02-23 10:38

  • 弈凌 (作者)

    你好,json-bigint导包已解决,不支持ts包,我换成js包就好了。但在uni.addInterceptor中拦截request是无效的,请问有什么较好的切点么,还是只能换库,uni.request api暂不支持。

    2023-02-23 10:52

  • DCloud_UNI_WZF

    回复 8***@qq.com: 参考文档检查你的用法是否正确,理论上不会存在api无效的问题

    如确认框架问题,提供最简可复现demo

    2023-02-23 10:55

  • 弈凌 (作者)

    回复 DCloud_UNI_WZF: 你好,我还想确认下dataType能传哪些类型(文档中没写),我传了个string问题就解决了。应该是uni.request默认会使用JSON.parse格式化,导致的long类型丢失精度

    2023-02-23 13:47

  • 弈凌 (作者)

    回复 DCloud_UNI_WZF: 将dataType改为string后,能解决精度丢失的问题,但这样需要我每次都去调用json-bigint.parse(),能否有一种优雅的方案,如统一拦截处理。

    2023-02-23 13:58

  • DCloud_UNI_GSQ

    回复 8***@qq.com: 可以,使用拦截API,或者再封装都可以

    2023-02-23 17:06

  • 弈凌 (作者)

    回复 DCloud_UNI_GSQ:

    你好,拦截api不支持替换值,示例如下,替换值操作无效:


    uni.addInterceptor('request', {  
    invoke(args) {
    // request 触发前拼接 url
    args.url = 'http://localhost:9999' + args.url
    },
    success(resp) {
    console.log('interceptor-success', resp);
    // 这行代码的结果,只在当前生效,并不能替换值
    resp = jsonBig.parse(resp);
    },
    fail(err) {
    console.log('interceptor-fail', err)
    }
    })

    2023-02-23 18:58

  • DCloud_UNI_WZF

    回复 8***@qq.com: 不要直接处理整个result,仅处理需要处理的属性

    可以了解下js闭包和作用域

    2023-02-23 20:09

  • 弈凌 (作者)

    回复 DCloud_UNI_WZF: 你好,感谢你的告知,已测试可以做到更细致化的拦截,但重新赋值的这一步是无效的,拦截器中重新赋值后,在当前请求中得到的结果还是原始结果。

    2023-02-24 11:06

弈凌

弈凌 (作者) - yl-yue

@DCloud_UNI_WZF 你好,见附件,这里默认会使用JSON.parse格式化,因此这里是否可以配置为使用json-bigint.parse格式化。我是暂时改成了string类型解决问题。

比如:这里的类型是否支持填jsonBigint,采用json-bigint.parse,填json就采用JSON.parse

  • DCloud_UNI_GSQ

    如果要的人多,后续可以考虑增加配置支持其他解析库,毕竟一旦增加是给每个开发者都附加一个解析库,并非都需要。

    2023-02-23 17:09

  • 弈凌 (作者)

    回复 DCloud_UNI_GSQ: 是的,需要支持更好的扩展性,这样不至于需要重新选型request工具库

    2023-02-23 19:00

弈凌

弈凌 (作者) - yl-yue

@DCloud_UNI_GSQ @DCloud_UNI_WZF

你好,请问类似此贴这样的需求,使用uni.requestapi实现的话,是否是暂时没有优雅的解决方案?

  • 拦截器中可以替换请求或响应值(如:请求与响应体的转换与加解密)

谈谈基于目前调研结果的想法

  1. uni.requestapi给我的感觉是个半成品,不能提供如:Axios这样的完善能力
  2. 我猜想uni官方就是只做跨端适配,并只提供基础的api能力,再由业务开发者去封装实现,因此插件市场才有那么多ui库,request工具库,但目前成熟的vue3+nvue ui库相对来说不尽人意。

可以的话,希望能解下惑,谢谢。

  • DCloud_UNI_GSQ

    request 的定位相当于浏览器的 Fetch API,提供基础稳定的功能,其他适合通过扩展方式实现不纳入核心库。

    2023-02-27 11:18

弈凌

弈凌 (作者) - yl-yue

问题已解决,@DCloud_UNI_GSQ @DCloud_UNI_WZF 建议在文档中补充一下,在returnValue拦截器中解决,并且uni.request()内不要传入callback(success / fail / complete任一个),否则returnValue内返回的是RequestTask对象

要回复问题请先登录注册