You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js API实现PDF字数统计遇Promise pending无响应问题求助

问题分析与修复方案

核心问题

  1. Express中间件未正确初始化:app.use(express.json) 缺少调用括号,应为 app.use(express.json()),否则无法启用JSON解析中间件(尽管当前是GET接口,规范写法仍需修正)。
  2. Promise未返回有效结果:变量s是pdf(data)的Promise,但.then()回调仅执行console.log,未返回统计后的结果,导致s最终resolve的值为undefined。
  3. 接口异步响应处理错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:35:29