为何pdf2json与pdf-parse无法在Next.js App Router中正常工作?
Next.js App Router 中 pdf2json 与 pdf-parse 无法正常工作的问题及解决方案
问题描述
在 Next.js App Router 项目中使用 pdf2json 和 pdf-parse 实现 PDF 解析时遇到异常:
pdf2json抛出ReferenceError: nodeUtil is not defined错误pdf-parse对应的 API 路由返回 404 错误
但相同代码在旧版 Pages Router 项目中可正常运行。
复现步骤
- 执行
npx create-next-app@latest,选择启用 App Router - 在
app/api/test目录下创建路由文件,添加以下代码:
import { NextResponse } from "next/server"; import fs from "fs"; import PDFParser from "pdf2json"; import pdf from "pdf-parse"; export async function GET() { const pdfParser = new PDFParser(); pdfParser.on("pdfParser_dataError", (errData: any) => console.error(errData.parserError) ); pdfParser.on("pdfParser_dataReady", (pdfData: any) => { console.log(pdfData); }); pdfParser.loadPDF("./sample.pdf"); return NextResponse.json({}); }
- 在项目根目录放置
sample.pdf文件 - 运行
curl localhost:3000/api/test,触发pdf2json错误:
- error node_modules/pdf2json/lib/pdf.js (66:0) @ eval - error Error [ReferenceError]: nodeUtil is not defined
- 替换为
pdf-parse代码后,请求返回 404:
import { NextResponse } from "next/server"; import fs from "fs"; import pdf from "pdf-parse"; export async function GET() { let dataBuffer = fs.readFileSync("./sample.pdf"); pdf(dataBuffer).then(function (data) { console.log(data.numpages); console.log(data.numrender); console.log(data.info); console.log(data.metadata); console.log(data.version); console.log(data.text); }); return NextResponse.json({}); }
解决方案
1. 解决 pdf2json 的 nodeUtil 未定义错误
错误原因是 App Router 默认使用 Edge Runtime,而 pdf2json 依赖 Node.js 核心模块,需显式指定路由使用 Node.js Runtime:
- 在路由文件顶部添加运行时配置:
export const runtime = 'nodejs';
- 调整代码为异步 Promise 形式,确保响应在解析完成后返回:
import { NextResponse } from "next/server"; import fs from "fs"; import PDFParser from "pdf2json"; export const runtime = 'nodejs'; export async function GET() { return new Promise((resolve) => { const pdfParser = new PDFParser(); pdfParser.on("pdfParser_dataError", (errData) => { console.error(errData.parserError); resolve(NextResponse.json({ error: errData.parserError }, { status: 500 })); }); pdfParser.on("pdfParser_dataReady", (pdfData) => { console.log(pdfData); resolve(NextResponse.json({ data: pdfData })); }); pdfParser.loadPDF("./sample.pdf"); }); }
2. 解决 pdf-parse 的 404 错误
404 是因为异步解析未完成就提前返回响应,需等待解析完成后再返回:
- 同样先指定 Node.js Runtime
- 使用
await等待pdf()异步操作完成:
import { NextResponse } from "next/server"; import fs from "fs"; import pdf from "pdf-parse"; export const runtime = 'nodejs'; export async function GET() { try { const dataBuffer = fs.readFileSync("./sample.pdf"); const parsedData = await pdf(dataBuffer); console.log(parsedData.numpages); console.log(parsedData.numrender); console.log(parsedData.info); console.log(parsedData.metadata); console.log(parsedData.version); console.log(parsedData.text); return NextResponse.json(parsedData); } catch (error) { console.error(error); return NextResponse.json({ error: 'PDF 解析失败' }, { status: 500 }); } }
核心原因
Next.js App Router 默认启用 Edge Runtime,该环境对 Node.js 核心模块支持有限;而 pdf2json、pdf-parse 依赖 Node.js 专属 API,因此必须显式指定路由使用 Node.js Runtime。Pages Router 默认使用 Node.js 环境,所以无此问题。
内容的提问来源于stack exchange,提问作者Andrew Luo
相关产品推荐
相关产品推荐

