小程序中遇到 data is read only 的只读问题

小程序开发中,统一添加一个接口发起的渠道标识,而对data进行处理

//app.js
App({
  globData:{
    sysInfo:{}
  },
  async onLaunch () {
    this._processAsync()
    this.globData.sysInfo=await wx.getSystemInfo()
  },
  _processAsync(){
    wx.requestAsync=function(params={}){
      const {url,method,data,header}=params
      // 统一添加一个接口发起的渠道标识
      data={
        ...data,
        // 渠道标识
        testData:'testData'
      }
      console.log(data);
      
      // 对数据筛选
      const formatData={}
      for(let pro in data){
        if(data[pro] !== undefined && data[pro] !== null){
          formatData[pro]=data[pro]
        }
      }
      return new Promise((resolve,reject)=>{
        wx.request({
          url: 'https://uinav.com/api/public/v1'+url,
          method:method||'GET',
          data:formatData,
          header,
          success:res=>{
            if(res&&+res.statusCode===200){
              if(res.data&&res.data.meta&&+res.data.meta.status === 200){
                resolve(res.data.message)    
              }else{
                reject(res)
              }
            }else{
              reject(res)
            }       
          },
          fail:err=>{
            reject(err)
          }
        })
      })
    }   
  }
})

编译后报错

Error: "data" is read-only
    at _readOnlyError (readOnlyError.js:2)
    at Object.wx.requestAsync (app.js? [sm]:14)
    at Se._callee$ (index.js? [sm]:15)
    at L (regenerator.js:1)
    at Generator._invoke (regenerator.js:1)
    at Generator.t.<computed> [as next] (regenerator.js:1)
    at asyncGeneratorStep (asyncToGenerator.js:1)
    at c (asyncToGenerator.js:1)
    at asyncToGenerator.js:1
    at new Promise (<anonymous>)

分析

注释掉app.js中的对data 数据处理这一块,编译处理,接口正常返回数据,那问题就在app.js中data这一块了,

而原封装接口调用函数中是用const 来解构接收params参数

const {url,method,data,header}=params

而后对其中的data处理

  const {url,method,data,header}=params
      // 统一添加一个接口发起的渠道标识
      data={
        ...data,
        // 渠道标识
        testData:'testData'
      }
      console.log(data);
      
      // 对数据筛选
      const formatData={}
      for(let pro in data){
        if(data[pro] !== undefined && data[pro] !== null){
          formatData[pro]=data[pro]
        }
      }

但是const 定义的是常量,无法对数据再操作。。。。。。。。

所以 替换成 let就可以了

没错,就是这么简单的一个问题,而自己也常犯这种错误。。。。。


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