wechat4u icon indicating copy to clipboard operation
wechat4u copied to clipboard

syncCheck问题

Open lmyzzu opened this issue 8 years ago • 6 comments

WechatCore syncCheck()方法中eval(res.data)经常出错 建议改写,不要用eval这种写法

lmyzzu avatar Jun 07 '17 10:06 lmyzzu

具体错误是什么?

spacelan avatar Jun 07 '17 11:06 spacelan

有时候会收到一些二进制数据,eval就会出错,例如这样的(base64 encode):

AQAGAFB3/f0OH/13/f0OAf13/f0OAFD9/QP9H/39/QP9Af39/QP9AAAT/QAABAA=

可以捕获eval异常,然后假装retcode和selector都是0,后续收发消息都是正常的。

MgaMPKAy avatar Jun 14 '17 01:06 MgaMPKAy

官方网页版微信就是通过执行返回的代码然后获取被赋值的对象来得到retcode的,这是解决跨域的一种方法

如果返回了奇怪的数据,那么网页版微信同样也会异常

wechat4u实现了异常重试的机制,所以因该不需要再对这里进行特殊处理吧

spacelan avatar Jun 14 '17 03:06 spacelan

我在chrome环境下,syncCheck居然会偶尔返回乱码 o¨a—’r9˜Ídó»Ýz=ésÝRAiÀ8²<a„΀¿ªâ&k 导致request就不往下执行也不报错。应该是axios处理乱码出了问题,我把syncCheck那块带request换成XMLHttpRequest就可以对乱码报错。 微信网页版syncCheck也偶尔会返回乱码,但是会再次发起syncCheck。

JimmyBryant avatar Jul 14 '17 09:07 JimmyBryant

@JimmyBryant 返回乱码这个问题是后台才发生的,但是没有影响node环境的同步,chrome环境还没测试过哈

你能定位到是具体哪个位置导致这个问题产生的么?

spacelan avatar Jul 14 '17 10:07 spacelan

问题在src/core.js=>syncCheck方法。 当返回乱码的时候,request后面的then以及catch不工作

return this.request({ method: 'GET', url: this.CONF.API_synccheck, params: params }).then(res => { let window = { synccheck: {} } // eslint-disable-next-line eval(res.data) assert.equal(window.synccheck.retcode, this.CONF.SYNCCHECK_RET_SUCCESS, res) return window.synccheck.selector })

JimmyBryant avatar Jul 17 '17 03:07 JimmyBryant