Express.js路由引用模块报错及PDF上传跳转展示问题咨询
核心原因
你遇到的所有问题根源是前后端运行环境完全隔离的认知误区:
- Express的路由代码属于Node.js服务端代码,运行在你的服务器进程中
- pdfjsLib、pdfjsViewer、你写的showPdf函数都属于前端代码,仅能在用户的浏览器环境中运行,两个环境的内存、全局变量完全不互通。你将前端脚本导入到后端路由中调用,自然找不到只有浏览器才会注入的pdfjsLib全局变量。
现有方案的错误点
- 逻辑链路完全不成立:你POST上传文件后跳转到
/reader的GET请求是全新的独立请求,后端既没有暂存你上传的PDF,跳转后的新页面也无法拿到之前选中的本地文件。 - 上传请求配置错误:使用FormData传文件时,
contentType需要设为false让jQuery自动处理边界分隔符,手动设为application/pdf会导致后端无法正常解析文件。 - 代码笔误:
server.js中导入的路由变量名是router,注册中间件时写的是readerRouter,运行会直接报错。 - 路由逻辑错误:
res.redirect执行后后续代码虽然会运行,但和用户端的页面已经没有关联,在服务端调用前端的showPdf没有任何意义。
修复方案
推荐你用最简单的纯前端实现方案,不需要后端参与文件处理,逻辑更简洁性能更高:
- 改造首页文件上传逻辑,不需要发POST请求,选中文件后直接将文件存入sessionStorage,再跳转页面:
uploadInput.onchange = (e) => { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = () => { // 将文件转成base64存入sessionStorage sessionStorage.setItem('uploadedPdf', reader.result); // 直接跳转reader页 window.location.href = '/reader'; }; reader.readAsDataURL(file); }
- 后端
/reader路由只保留GET渲染页面的逻辑,删除POST路由,删除导入showPdf的代码。 - reader页面加载时直接从sessionStorage取文件渲染即可:
// reader页面的js逻辑 pdfjsLib.GlobalWorkerOptions.workerSrc = '../node_modules/pdfjs-dist/build/pdf.worker.js'; const eventBus = new pdfjsViewer.EventBus(); const pdfLinkService = new pdfjsViewer.PDFLinkService({ eventBus }); window.onload = () => { const pdfData = sessionStorage.getItem('uploadedPdf'); if (!pdfData) return location.href = '/'; // 转成Uint8Array传给pdfjs const typedArray = Uint8Array.from(atob(pdfData.split(',')[1]), c => c.charCodeAt(0)); pdfjsLib.getDocument(typedArray).promise.then(_pdfDoc => { const pdfDoc = _pdfDoc; // 后续渲染逻辑 }); }
- 确认reader页面的依赖引入顺序正确:先引入pdf.js核心库,再引入viewer组件库,最后引入自定义脚本,即可解决
pdfjsLib is not defined的报错。
如果你一定要走后端存储的方案,流程改为:
- 后端接收到POST上传的PDF后,存入临时目录生成唯一文件ID,重定向到
/reader?fileId=xxx - reader页面加载时从URL参数取fileId,请求后端接口拿文件流再传给pdf.js渲染
- 额外添加临时文件定时清理逻辑避免服务器磁盘占用过高。
内容的提问来源于stack exchange,提问作者bzmind
相关产品推荐
相关产品推荐

