Node.js API实现PDF字数统计遇Promise pending无响应问题求助
问题分析与修复方案
核心问题
- Express中间件未正确初始化:
app.use(express.json)缺少调用括号,应为app.use(express.json()),否则无法启用JSON解析中间件(尽管当前是GET接口,规范写法仍需修正)。 - Promise未返回有效结果:变量
s是pdf(data)的Promise,但.then()回调仅执行console.log,未返回统计后的结果,导致s最终resolve的值为undefined。 - 接口异步响应处理错误:
resp.send()无法直接接收Promise作为参数,且当前的s.then()回调未返回要发送的数据,导致接口无法正常返回响应。
修正后的代码
const express = require("express") const app = express() const fs = require("fs") const pdf = require("pdf-parse") const dataBuffer = fs.readFileSync("pdf/book.pdf") const port = 3001 // 修正中间件调用,添加括号 app.use(express.json()) function countWords(str) { str = str.replace(/(^\s*)|(\s*$)/gi, ""); str = str.replace(/[ ]{2,}/gi, " "); // 全局替换换行后的空格,原代码只替换一次 str = str.replace(/\n /g, "\n"); return `total number of words in this book\n${str.split(' ').length}`; } // 让Promise返回统计结果 const pdfWordCountPromise = pdf(dataBuffer).then(data => { const result = countWords(data.text); console.log(result); return result; // 返回结果,让Promise最终resolve为统计值 }); app.get("/data", async (req, resp) => { try { // 使用await等待Promise完成,获取结果后发送响应 const countResult = await pdfWordCountPromise; resp.send(countResult); } catch (err) { // 捕获解析PDF时的错误,返回错误响应 resp.status(500).send(`Error processing PDF: ${err.message}`); } }) app.listen(port, () => { console.log(`Express listening on port ${port}`); })
关键修改说明
- 将
express.json改为express.json(),正确加载JSON解析中间件。 - 修改
pdf(dataBuffer).then()回调,添加return result,让Promise最终返回统计后的字符串。 - 在
/data接口中使用async/await语法等待Promise完成,获取结果后调用resp.send()返回响应,同时添加错误捕获处理,避免未处理的Promise拒绝导致服务器崩溃。 - 优化
countWords函数中的正则替换为全局模式(/\n /g),确保所有换行后的空格都被替换。
内容的提问来源于stack exchange,提问作者xyz
相关产品推荐
相关产品推荐

