一部分的项目功能要上线,前前后后上线了三次调试了无数次才成功,下面是记忆中的一些个过程。
功能描述:企业微信上传一份pdf文件,上传完了以后立即查阅。
功能点:企业微信文件上传、上传至obs(内网),上传后通过流的方式查看。
前情:该部分的功能,由测试在测试环境上进行了测试,但在发布到线上后,功能无法使用。
排错过程:
12.1:打包好了代码,发送了邮件,代码上线,发现在测试环境中没有异常的功能变得无比怪异。上传到服务器的文件无法查看,报文件已损坏。由于我负责的是后端的代码,而且后端在这块功能上没什么改动,只是加了一个前端的入口,调的接口都是原先已有的功能。
问题描述:电子pdf上传后,预览时,出现文件已损坏的提示。
由于功能是在企业微信上的,无控制台,测试的账号也是临时要过来的,放到线上功能不行,没什么头绪。
分析:由于在测试的时候一直使用的是OSS文件上传的方式,没有出现任何差错。所以,肯定是上传OBS的过程中哪里出现了异常。
排查:看服务器打印的日志,发现后台没有报错,由于微信没有控制台,所以只能看代码,后端代码应该没有问题(年轻),于是看前端代码,两边环境主要是OBS和OSS不同,所以可能会有所差异,询问同事,说是查看pdf的话,有一个通过token和资源url访问的,检查代码差异,与pc端(已有类似功能)代码对比,分析过后,发现是有一个校验,通过登录的用户,生成一个token,然后在查询obs资源的方法中,会根据token去拉取存在redis的用户信息,如果没有用户信息,则不允许查看,返回无权访问,初步推断是没有token没有权限的问题(其实后面我分析的时候,这个token对用户查看自己上传的电子志愿书是有用的,但是对于管理端来说,不是非要不可的,也能查看到),于是前端换取token的方法查看pdf,但换完之后,还是失败。
失败后,通过接口访问我本地代码,看到接口返回的信息、url等与接收的格式不一致,于是改成一致的,也在页面使用alert框,打出了上传的pdf在obs的路径,发布后,依旧失败,到此,上线失败。
12.2:吸取了昨天的教训,我们现在测试环境校正了所有传递以及返回的参数,发现没问题后,下班后继续上线。
调试方案:这次的功能不直接发布给客户,而是要通过特定的连接进行页面访问,不开放入口,所以可以自由修改以及弹出页面内容,发布后,pdf预览仍然失败。好,开始分析问题。
分析:首先查看日志,在pdf推送输出流的时候,有日志打印,此时,发现日志仍然没有报错。开始换个方向,在页面中增加alert弹窗,弹出每个步骤的请求以及返回数据,拿token,拿页面地址,获取推送流,打印后,拿到截图,将截图内容抽出,拿到了token,加密后的上传的url,于是在服务器上查看了token,url,发现token是有效的状态的。url在obs上也是成功上传的,可以看到上传后的文件,地址没错,并且文件的权限和obs桶内的其他文件权限一致。搜索用户解析加密url日志,也有搜索到,排查后端流程正常进行。于是前端使用ajax请求每个请求,打印返回信息。
我尝试登录该项目的pc端,拿到其他地方查看pdf的token,有效的token,当然obs的连接,布置在内网,直接在url上是访问不了的,我在请求中获取到了pdf加载的路径。同样,根据调取流的路径,可以拿到pdf的展示。
开始使用一份pdf的token访问不同用户的pdf,发现可行。
于是使用一个有效token,去请求在企业微信上传的pdf文件,发现不可行,文件报出系统繁忙,并且使用企业微信返回的token,也无法查看到pc端能看到的pdf(可能是token过期了)继续排查,发现有效的token也访问不到文件,而企业微信上传的文件,通过解密规则解密出来后的路径是正确的。想是不是微信上传的文件有问题,至此,上线失败。
后面分析,在浏览器调用该特定的url进行文件上传,但由于用户没有登录,所以查看的时候一直是无权访问,于是只能拿有效的token进行访问。发现通过token依旧访问不到。于是一直进行测试,突然发现,企业微信的pdf上传后竟然能够访问,并且图片上的水印用户为刚pc端登录的用户,猜想pc端的登录token和微信页面共享了,测试后发现确实如此,而pdf也能够正常访问。
于是分析:能访问的话,说明代码没问题,可能是两个原因引起的:1、用户在企业微信内登录,但是在外面点击链接的时候,token未共享,所以没权限查看。2、上传的文件有问题
12.3:确认以上的两个问题:1、测试发现在企业微信后登录是有效的,所以是拥有权限的。2、经过我重新发送文件后,替换了测试用的文件,发现能够成功访问,经过其他几个文件,也能够正常查看,所以是文件异常。3、如果以上都有问题的话,两边查看pdf唯一的不同还是解密的方式不同,pc端的通过hex将二进制转换成str后,又通过URLEncode和DES3进行了解密,而微信端的只通过了hex,但得到的路径都是对的,在pc端解密的时候,加上了utf-8,猜想是不是数据传递过程中编码格式错乱了。
于是,保证功能正常运行,代码重新上线。
功能2:上传图片查看失败,排查是由于obs上传需要打开公共读的权限所致。
但是为什么文件有问题,为什么拼接正常的token却访问不到,这个问题现在没有答案,猜想:1、文件确实有问题,但是在obs内部却可以正常查看。2、文件公共读权限没有,但是后面上传的文件都可以访问,调用的同一个上传接口。3、我直接拼接url不可访问可能是ocr工具识别的时候识别错动了某个字符,测试发现,加密码长度一样的话,展示的都是空白页面,但这也不能解释在微信上上传预览失败的问题。
由于项目已经上线,所以这个问题仍旧存疑。但总算是成功上线了。