1. 当PDF.js抛出"Stream must have data"时究竟发生了什么
第一次在控制台看到这个错误时,我盯着屏幕愣了三秒——明明文件已经上传成功,为什么PDF.js会提示"没有数据"?这就像你去ATM取钱,银行卡插进去了密码也输了,机器却告诉你"账户不存在"。后来在多个项目中反复踩坑后,我才理解这个看似简单的错误背后,其实藏着从客户端到服务端的完整数据链路问题。
PDF.js的工作原理其实很像一个快递系统:当你调用pdfjsLib.getDocument()时,它会发起一个"取件请求",这个请求需要完整经历以下环节:
- 前端正确构造请求(填写快递单)
- 网络稳定传输(快递运输)
- 服务端返回有效PDF数据(包裹完好)
- 浏览器正确解析响应(签收验货)
最近在调试一个Vue项目时遇到典型场景:本地开发环境预览正常,但部署到测试环境就报错。用Chrome开发者工具检查Network面板才发现,生产环境的API地址配置错误导致实际请求404,但PDF.js只笼统地报了"Stream must have data"。这就是为什么我们需要建立系统化的排查思维——错误提示只是结果,真正的病因可能藏在任何环节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 构建全链路排查框架:从浏览器到服务器的六层检查
2.1 前端请求层:你的请求真的发出去了吗?
先分享一个真实案例:某次我花了两个小时排查"数据缺失"问题,最后发现是前端路由配置错误,根本没触发PDF预览请求。所以第一步永远要确认——请求是否真实发出?
在Chrome开发者工具中,我会重点检查:
- Network面板是否有PDF相关请求(过滤XHR或Fetch类型)
- 请求URL是否包含特殊字符需要encodeURIComponent处理
- 请求头是否携带必要认证信息(如Authorization)
- 如果是POST请求,查看payload数据格式
javascript复制// 典型的问题请求示例 - 未处理特殊字符
const badUrl = `/api/pdf?name=${fileName}`; // 当fileName含#等字符时会截断
// 正确的请求构造方式
const safeUrl = `/api/pdf?name=${encodeURIComponent(file
