如何将pdf2json事件回调转为async/await以适配Azure Function?
解决Azure Function中pdf2json事件回调未执行就结束的问题
我碰到过一模一样的问题!Azure Function的异步执行模型会在函数返回时立即终止进程,而你原来的代码里pdfParser_dataReady是事件驱动的异步回调,没有被函数等待,所以函数直接提前结束了。要解决这个问题,我们只需要把事件回调逻辑包装成一个Promise,这样就能用async/await让函数乖乖等待PDF解析完成。
这里是修改后的完整实现:
var request = require('request'); var PDFParser = require("pdf2json"); // 把PDF解析逻辑包装成返回Promise的函数 async function parsePdfFromUrl(pdfUrl) { return new Promise((resolve, reject) => { const pdfParser = new PDFParser(this, 1); // 处理解析成功事件,完成后返回PDF数据 pdfParser.on("pdfParser_dataReady", (pdf) => { resolve(pdf); }); // 处理解析错误事件,抛出错误信息 pdfParser.on("pdfParser_dataError", (err) => { reject(err); }); // 发起请求并将数据流导入pdfParser request({ url: pdfUrl, encoding: null }).pipe(pdfParser); }); } // Azure Function的入口函数示例 module.exports = async function (context, req) { try { const pdfUrl = req.query.pdfUrl || "你的默认PDF链接"; // 等待PDF解析完成再继续执行 const pdfData = await parsePdfFromUrl(pdfUrl); // 这里写你处理PDF数据的业务逻辑 context.log("PDF解析完成:", pdfData); context.res = { status: 200, body: { message: "PDF解析成功", data: pdfData } }; } catch (err) { context.log.error("PDF解析失败:", err); context.res = { status: 500, body: { message: "PDF解析出错", error: err.message } }; } };
关键细节说明:
- 我们把PDF解析的事件流包装成了
Promise,让异步的事件触发逻辑可以被await等待,确保Azure Function不会提前结束。 - 入口函数声明为
async,用try/catch包裹await调用,既保证了等待逻辑,也能捕获解析过程中出现的错误。 - 这样修改后,Azure Function的执行逻辑就和你本地运行时完全一致了,会等到PDF解析完成后再返回响应。
内容的提问来源于stack exchange,提问作者Mayank Kumar Chaudhari
相关产品推荐
相关产品推荐

