uniapp开发遇到的问题(1)

1,539 阅读2分钟

uniapp开发遇到的问题(1)

文件上传

form表单上传中,中有一个file, 后端需要一种二进制格式(巨坑......)

这个东西把我心态搞蹦了,第一次写这个uniapp, 我很正常的本选中的文件后把值赋给file,改变header,其转成formData 传递给后端.传的过程中这个东西变成了[object file],正常来说应该是(binary),于是我入坑了,我开始想办法强制把对象转为(binary)

文件对象获取二进制文件
  • 使用FileReader.readAsBinaryString() MDN 后面面可以查看用法 读取二进制文件

  • 发现二进制乱码.通过new String(bytes,0, size, "utf-8") 解决问题

  • 发现他不是(binary),他就是一串String

  • 接着各种biadu, google,bing

  • .......(裂开)

    image-20211130204053836

解决方案

  • 换一个请求方式npm了一个axios, 直接传文件,md竟然就可以了.(再次裂开)

axios 传值的方式,通过formdata来传参数

不要用uni.request()来请求数据

路由

尽量使用this.$Router.back()的回退来回退历史(可以从git版本管理来理解这个,回退上一个版本)

this.$Router.replace('')替换当前路由,跳转过后上一个路由就不在存在.直接到上上一个路由

this.$Router.push('') 往路由历史加一个路由

封装uni.request请求,可以按照此方法封装axios

method 方法

url路由

params 参数

beforeCallback 封装的调用接口之前执行的方法

afterCallback调用接口之后执行的方法

let ajaxTimes = 0; //处理多个的异步请求
const request = (method, url, params,beforeCallback,afterCallback) => {
  ajaxTimes++; //每一个请求都会使计数+1
  if(typeof beforeCallback === "function"){
    beforeCallback();
  }
  params = params || {};
  params = JSON.parse(JSON.stringify(params));
    
  // 这里一定要做处理
  Object.keys(params).forEach( elem => {
      if(typeof params[elem] === "object"){
          params[elem] = JSON.stringify(params[elem]);
      }
  })
  // 加载页面 动画
  uni.showLoading({
      title: "加载中",
      mask: true,
  });
    
  return ... // 这里return一个请求实列对象.
  // forExample 
  return new Promise((resolve,reject)) => {uni.request({
      url,
      method,
      data:params,
      success: res => if(res.data.code == 200) {resolve(res)},
      fail: res => reject(res),
      complete: () => {
      ajaxTimes--;
        if (ajaxTimes === 0) {
            //  关闭正在等待的图标
            uni.hideLoading();
        }
        if(typeof afterCallback === "function"){ afterCallback(); }
      }
  })}
}

\