微信小程序请求后端传回 long 类型 id 值,js 读取精度丢失的解决方法

  • Post author:
  • Post category:小程序


  1. 微信原生 wx.request 请求的方式

    在接口请求的数据接收类型设置为 dataType: ‘text’

    然后在 success 回调函数里添加:res.data=handleResData(res.data)
import * as $utils from '@/utils/index'

wx.request({
  url: 'https://www.baidu.com/',
  method: 'get',
  data: {
    x: '',
    y: ''
  },
  dataType: 'text',
  success (res) {
    res.data = $utils.handleResData(res.data)
    console.log(res.data)
  }
})



utils/index.js

/**
 * @description 将所有对应的长整数value,通过正则查出加上字符串的双引号标识,然后进行JSON.parse()转回json对象
 * @param {*} str
 * @returns
 */
export const handleResData = (str) => {
  var _str = str
  for (var i = true; i == true; ) {
    var i = /[:][0-9]{18,}[,]?/.test(_str)
    if (i == true) {
      var handlestr = /[:][0-9]{18,}[,]?/.exec(_str)
      var handlestr2 = /[0-9]{18,}/.exec(handlestr[0])
      _str = _str.replace(handlestr[0], ':"' + handlestr2[0] + '",')
    }
  }
  _str = _str.replace(/[,][}]/g, '}')
  return JSON.parse(_str)
}
  1. uni-app集成axios封装接口请求的
import adapter from './_adapter.js'
import * as $utils from '@/utils/index'

// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项,表示请求URL公共部分
  baseURL: process.env.VUE_APP_BASE_URL,
  // 超时(毫秒)
  timeout: 10000,
  dataType: 'text',
  // 解决后端返回Long类型的数据前端精度丢失问题
  transformResponse: [
    function (data) {
      try {
        // 转换
        return $utils.handleResData(data)
      } catch (err) {
        // 转换失败就直接按原数据返回
        return data
      }
    }
  ]
})
service.defaults.adapter = adapter
service.defaults.retry = 5 // 设置请求次数
service.defaults.retryDelay = 1000 // 重新请求时间间隔



axios适配器配置文件: _adapter.js

import settle from 'axios/lib/core/settle'
import buildURL from 'axios/lib/helpers/buildURL'
/* 格式化路径 */
const URLFormat = function (baseURL, url) {
  return url.startsWith('http') ? url : baseURL
}
/* axios适配器配置 */
const adapter = function (config) {
  // console.log('adapter', config)
  return new Promise((resolve, reject) => {
    uni.request({
      method: config.method.toUpperCase(),
      url: buildURL(
        URLFormat(config.baseURL, config.url),
        config.params,
        config.paramsSerializer
      ),
      header: config.headers,
      data: config.data,
      dataType: config.dataType,
      responseType: config.responseType,
      sslVerify: config.sslVerify,
      complete: function complete(response) {
        response = {
          data: response.data,
          status: response.statusCode,
          errMsg: response.errMsg,
          header: response.header,
          config: config
        }
        settle(resolve, reject, response)
      }
    })
  })
}

export default adapter



版权声明:本文为qq_24504591原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。