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

在小程序开发过程中,遇到数据只读错误。问题源于在app.js中尝试处理data,而接口调用函数使用const解构params,导致无法修改data。解决方案是将const改为let,从而允许对数据进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小程序开发中,统一添加一个接口发起的渠道标识,而对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就可以了

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值