PDF预览异常:Cannot read properties of undefined (reading ‘getReader‘)

1. 异常描述

​ 这周线上环境报了一个异常,用户在移动端预览文件时报错,错误信息:“UnknownErrorException: Cannot read properties of undefined (reading ‘getReader’)”

在这里插入图片描述

2. 问题排查

2.1 版本冲突?

​ 笔者也很纳闷,最近没有改过代码,没有改过依赖,虽然有上线但都是改容器的配置。但上线就会重新部署,于是笔者怀疑是重新拉取底层依赖的时候依赖版本发生了变化。(笔者也不确定。。不李姐。。)

​ 于是在本地运行了项目,可以正常预览,但是测试环境同线上报同样的错误(“在我电脑运行的好好的”)。没办法基于上面的猜想只能先改下依赖,于是使用之前在另一个项目实践的可行版本组合修改依赖版本。(笔者之前在另一个项目中负责预览功能,自己写了一个简单pdf预览,遇到了版本不匹配的问题,修复后总结为文章 ng2-pdf-viewer实践,欢迎阅读指正)

​ 根据之前的实践,笔者修改了package.json、package-lock.json,然后发布测试环境测试,但依然没能解决这个问题,报同样的错误。

2.2 使用方式

​ 莫得办法,上网搜索,但搜索结果却寥寥无几。好多回复说是因为对象为undefined然后去调用了其方法,好吧,谜底就在谜面上。。或者是什么 reading 'catch'reading 'xxx'

​ 好彩一位博主的文章给了笔者思路。

  1. TypeError: Cannot read properties of undefined (reading ‘getReader’) #14850:啥用没有,题主提了相同的问题,下面的回复是让题主去参考官网的案例。。。💔
  2. Pdf.js body.getReader 报错问题:博主描述了相同的问题,根据源码的指引,确定了报错的具体位置,并提出了解决方案。虽然博主的使用方式同笔者不同,但根据该文章,笔直更改了ng2-pdf-viewer的入参方式,解决这个问题,即将入参改为Uint8Array数据。

3. ng2-pdf-viewer的使用

​ 在报错的项目中,ng2-pdf-viewer的使用方式如下:

<pdf-viewer [src]="pdfUrl"
            [render-text]="true"
            style="display: block; height: 500px;"
></pdf-viewer>

​ src的入参是一个url链接,pdf-viewer组件拿到url链接后会发送一个网络请求,取回blob数据进行展示,在对响应体进行处理的过程中报错。这就是令人困惑的地方,这个url返回的是blob格式的数据,源码为什么要调用response.body.getReader(),response就是blob,还要去获取body?

​ 那么来看下src参数,进入pdf-viewer源码:

src: string | Uint8Array | PDFSource;

​ 于是笔直将src的参数从url链接改为Uint8Array数据,笔直在 ng2-pdf-viewer实践 中使用的就是这种方式,因为没有去做网络请求,而是直接读取了一个本地文件,然后将本地文件转为ArrayBuffer传给src参数。

(Uint8Array 和 ArrayBuffer的区别和联系可自行查阅资料,或者参考 JS中ArrayBuffer和Uint8Array区别

4. 解决方案

​ OK,那么对代码进行改造。

html

<pdf-viewer [src]="pdfSrc"
            [render-text]="true"
            style="display: block; height: 500px;"
            onError="pdfError($event)"
></pdf-viewer>

component

ngOnInit() {
  // 网络请求,获取blob数据
  const blob = await this.attachService.getPdf(this.pdfUrl).toPromise();
  const reader = new FileReader();
  reader.readAsArrayBuffer(blob);
  // 注意,reader.result不能直接访问,需要调用.onload,加载后在回调函数中获取
  // 笔者一开始也是将reader定为全局变量,然后将reader.result直接赋值给[src]发现不起作用!!!
  // 才回去看FileReader文档的
  reader.onload = () => {
    this.pdfSrc = reader.result;
  }
}

// 之前在做预览功能的时候看到用网友提问说预览空白,其实可以使用onError将异常输出用于排查问题
pdfError($event){
  console.log($event);
  // 友好提示
}

​ 好了,只能说问题解决了,pdf可以正常预览,但底层的具体原因,笔者也不知道,欢迎补充。一个是在代码、package.json没有改动的情况下为什么不可预览了,原先功能是OK的;二是,入参是url,为何要调用.body.getReader()。不李姐,持续学习吧。

5. 前人的肩膀

  1. ng2-pdf-viewer(Github,有案例,有参数说明)
  2. Pdf.js body.getReader 报错问题
  3. ng2-pdf-viewer实践(欢迎阅读指正)
  4. JS中ArrayBuffer和Uint8Array区别
  5. Uint8Array
  6. ArrayBuffer
  7. FileReader
  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用和引用的信息,错误信息"TypeError: Cannot read properties of undefined (reading 'getIndexes')"可能是在处理文件预览或选择区域时出现的问题。错误提示中的"Cannot read properties of undefined"意味着代码尝试读取未定义的属性。这可能是由于未正确设置或传递数据导致的。 解决此错误的方法可能包括: 1. 检查代码中关于文件预览和选择区域的逻辑,确保数据正确传递和设置。 2. 确保children属性不为空,可以是一个空数组([])或null,如引用所示。 3. 检查代码中的错误处理逻辑,确保在处理undefined或null的情况下不会引发错误。 4. 如果使用的是特定的库或框架,可以查看相关文档或社区支持来寻求解决方案,如引用所提到的更改ng2-pdf-viewer的入参方式。 请注意,由于提供的引用信息有限,上述解决方案仅供参考,具体的解决方法可能需要根据代码和环境进行调试和调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [PDF预览异常:Cannot read properties of undefined (reading ‘getReader‘)](https://blog.csdn.net/Nile_Holmes/article/details/126080245)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [VanPicker组件 TypeError: Cannot read property ‘text‘ of undefined](https://blog.csdn.net/SugarXiXixi/article/details/119612120)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值