使用pdfreader库解析PDF时Async Await返回undefined如何解决
问题根因
你使用的pdfreader库的parseBuffer方法是回调式异步API,本身不返回Promise,所以直接await是无效的,代码不会等待回调执行完毕就会向下执行,提前返回初始值ENGR = false,这就是返回顺序异常的核心原因。
解决方案
将parseBuffer手动包装为Promise,在回调的结束节点(错误触发、解析完成)执行resolve/reject变更Promise状态,这样await就能正常等待解析全流程完成后再继续执行后续代码。
修正后的完整代码
const pdfreader = require("pdfreader"); module.exports = async function pdfPageParser(pageBuffer, pageKey) { const keyword = 'xyz'; // 手动将回调式API包装为Promise return new Promise((resolve, reject) => { let ENGR = false; new pdfreader.PdfReader().parseBuffer(pageBuffer, (err, item) => { // 解析出错时reject抛出错误 if (err) { console.log(err); return reject(err); } // item为空代表解析全部完成,resolve最终结果 if (!item) { console.log('Finish Parsing'); return resolve(ENGR); } // 匹配到关键词时更新状态 if (item.text && item.text.toLowerCase().includes(keyword)) { ENGR = true; } }); }) }
逻辑说明
- 整个解析流程被包裹在Promise内部,只有解析完全结束或者出错时,Promise才会变更状态,外层的
await才会继续执行后续代码 - 你之前尝试直接获取
parseBuffer返回值的方式无效,因为回调函数的return值不会传递到外层,只有通过Promise的resolve/reject才能把结果正常传递出去 - 外层调用逻辑不需要修改,仍然可以用
const variable = await pdfPageParser(pdfBuffer, pageKey)的写法等待返回结果
内容的提问来源于stack exchange,提问作者Tianyu Duan
相关产品推荐
相关产品推荐

