小程序—C 端 业务接口数据错误上报与问题定位

883 阅读4分钟
作者:QP

xxx项目于2020年11月30日正式投入试用,使用期间每天都有各种各样的用户反馈,有一眼就能看出问题的、有样式的问题、有老数据问题、有兼容问题,有脚本错误问题,等等。

一、对于WEB 端来说

1、比较好解决问题,直接让用户提供账号密码,在自己的电脑上就可以定位问题,APP 的问题,也是同样如此,都可以通过登录账号的方式,在本地操作看到日志,然后与后端进行一起定位,很快就可以定位出原因,快速处理解决。

二、对于微信小程序

a、然而,小程序就比较例外,是通过微信授权登录体系就行的,我们无法拿到用户的微信号进行登录操作;
b、期间,我定位小程序的一些问题,主要以往经验,以及对小程序的认识,业务的理解,定位问题。
c、但是这种定位问题的方式,试错成本较大,特别是一些关键的业务流程,养户是需要马上处理,否则养殖业务无法继续下去,另外,假如换了一个人,对业务逻辑不太熟悉的,可能就没那么好定位了;
d、因此,C 端的业务接口数据错误上报,变得尤为重要。因此我开始了此项工作的设计~~

微信小程序在管理后台,也有提供查看日志的功能,但此类的日志,只能查看该用户由于脚本、api 调用出错的

对业务逻辑不太熟悉的可能就没那么好定位了
同时,也提供  developers.weixin.qq.com/miniprogram…   接口,自定义业务数据错误上报

但是此方式不够灵活,而且后端开发人员较多,每个人负责不同的模块,每次都要登录小程序的管理后台定位问题,也是很不方便的操作。所以~~~  自己搞吧。

设计前的思考: 1、不能够一直上传数据,否则会造成数据爆炸。通过开关解决

2、开关不能够太明显,否则会对用户造成困扰。隐藏式按钮,必要时才知道用户打开  出现问题时,需要远程指导用户,按具体的问题,触发开关

3、开启数据上传开关之后,需要自动关闭,否则会造成无效数据上传。通过时间对比,超过指定时间后自动关闭。

  1. 按钮页面: 页面进来的时候,通过本地的缓存,初始化按钮状态  
onShow() {
   const switchStatus = storage.getStorage('switchStatus') || false
   this.setData({
     isOpen: switchStatus
   })
 },

 2)  点击开关,改变按钮状态的同时,记录当前的时间,用作计算时间差

 switch() {
 const { isOpen } = this.data
 this.setData({
   isOpen: !isOpen
 })
 storage.setStorage('switchStatus', !isOpen)
 if(!isOpen){
   storage.setStorage('switchStatusCreateTime', dayjs().format('YYYY-MM-DD HH:mm'))
 } else {
   storage.removeStorage('switchStatusCreateTime')
 }
}

3)  触发上传操作的时候,计算间隔

 // 获取当前的时间
const currentTime = dayjs()
// 获取本地存储的时间
const switchStatusCreateTime = storage.getStorage('switchStatusCreateTime')
// 获取开关状态
const switchStatus = storage.getStorage('switchStatus')
// 对比2个时间,是否已经超过12小时  
const outTimeNumber = currentTime.diff(dayjs(switchStatusCreateTime), 'hour')
try {
 if (outTimeNumber > outTime) { //  超出时的时间,主动清除上传开关缓存记录时间
   storage.removeStorage('switchStatusCreateTime')
   storage.removeStorage('switchStatus')
 } else if (outTimeNumber < outTime && switchStatus) { // 在开关有效期时间内
   const systemInfoObj = getSystemInfo() // 设备信息
   const userInfo = getUserInfo()
   const payLoad = {
     interfaceUrl,
     traceId,
     accountId: userInfo.accountId,
     userName: userInfo.userName,
     phone: "",
     otherData: { ...systemInfoObj, ...userInfo }
   }

   postRequestData(baseUrl, payLoad)
 } else { // 重置所有配置
   storage.removeStorage('switchStatusCreateTime')
   storage.removeStorage('switchStatus')
 }
} catch (error) {
 console.log("error",error);
}

4、数据上传到哪里?  后端能查看到就可以,保存到业务数据库就很简单,后端直接提供接口处理。

  后端提供一个日志接口,把需要上传的信息,按照后端规定好的格式上传,一般是用户信息、设备信息,还有关键的 traceId 、interfaceUrl,比如我就整理了比较多的信息上传

5、触发的时机,应该是即时的,无论业务接口成功或者失败,都应该触发。

即时触发,肯定是用户使用的时候,马上触发了,放在网络请求的位置最合适不过,我就放在了用户发起请求的成功或者失败的位置,都做一个上传 

以上总结,不仅仅限用于小程序,所有H5 的思路都是差不多的,小程序得益于丰富的API ,获取用户信息、设备信息更为简单。