起因
早上上班同事跟我说本地测试无误提交到线上的pdf预览下载功能在服务器上预览白屏让我看一下问题。
捉虫:找不同
开始排查问题,发现异常提示:
- pro:
- dev:
dev虽有报错但是正常显示,无伤大雅,pro无报错但是显示失败
1.路径问题?
- 开始面向百度编程:发现网上有人有过打包后预览失败问题,是因为worker.js路径问题。
- 但是区别是会有个404的报错,这边先不管试了再说,发现失败。
2.不起眼的报错
- 搜了百度、google,都没发现其他相关的解决方案,看来只能靠自己了。
- 首先从不起眼的warning开始找起。
warning: docexception - expected a valid error.
然后打印了一下src的值,发现一个有意思的东西
pendingoperation = pendingoperation.then(function() { var loadingtask; if ( ispdfdocumentloadingtask(src) ) { if ( src.destroyed ) { emitevent('error', new error('loadingtask has been destroyed')); return } loadingtask = src; } else { loadingtask = createloadingtask(src, { onpassword: function(updatepassword, reason) { var reasonstr; switch (reason) { case pdfjs.passwordresponses.need_password: reasonstr = 'need_password'; break; case pdfjs.passwordresponses.incorrect_password: reasonstr = 'incorrect_password'; break; } emitevent('password', updatepassword, reasonstr); }, onprogress: function(status) { var ratio = status.loaded / status.total; emitevent('progress', math.min(ratio, 1)); } }); } console.log(loadingtask) return loadingtask.promise; }) .then(function(pdf) { pdfdoc = pdf; emitevent('num-pages', pdf.numpages); emitevent('loaded'); }) .catch(function(err) { console.log(err) clearcanvas(); clearannotations(); emitevent('error', err); })
- pro:
- dev:
既然走到rejected里了,那就看看报错提示,刚好有打印
wtf?!线索到这里就断了。
但是,有一个忽略的细节,没错,那个warning,通常warning都不算错,基本都是选择性忽略,这次没有任何问题只能取看看这个了。
首先全局搜索,发现报错提示在这:
pdfjs-dist>es5>build>pdf.js 14109
然后发现reason为undefined,打印ex
报错信息:
“failed to set the ‘responsetype’ property on ‘xmlhttprequest’: the response type cannot be changed for synchronous requests made from a document.”
一番找,终于把真实的报错信息找到了真实的报错信息【枚举报错信息居然没做兜底!】
接下来就简单了,找到出问题的地方:
pdfjs-dist>es5>build>pdf.js 25685
xhr.open("get", this.url); xhr.open("get", this.url,true);
加上true即可
再进行测试,pro版本和dev版本一致了成功预览
修复bug
既然问题找到了,修改后测试无误,那就使用npx打个补丁
npx patch-package pdfjs-dist
执行完成会生成一个patches文件夹,里面有个这样的文件。
最后在 package.json 的 scripts 中加入
"scripts": { "postinstall": "patch-package" }
总结
搞定!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论