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

Next.js 13 API路由处理器调用pdfParse返回404问题求助

问题描述

我跟着教程做PDF文本提取,教程里在Express服务器上实现PDF上传并提取文本完全正常,但转到Next.js 13的路由处理器时,调用pdfParse()后服务器直接返回404,代码如下:

import pdfParse from 'pdf-parse'
import { NextResponse, type NextRequest } from 'next/server';
 
export async function POST(request: NextRequest) {
    const formData = await request.formData();
    const file = formData.get('pdf');
    
    // console.log(file) -- 这里能正常输出文件信息
    // 调用这行后服务器直接返回404
    const pdfData = await pdfParse(file)

    // 永远执行不到这里
    return NextResponse.json({"message": "Error"})
}

我不想额外运行Express服务器,该怎么解决?

解决方案

1. 转换File对象为Buffer格式

pdf-parse在Next.js的Edge Runtime环境下无法直接处理FormData获取到的File对象,必须先把File转成Buffer格式:

import pdfParse from 'pdf-parse'
import { NextResponse, type NextRequest } from 'next/server';
 
export async function POST(request: NextRequest) {
    const formData = await request.formData();
    const file = formData.get('pdf') as File;
    
    if (!file) {
        return NextResponse.json({ error: '未上传文件' }, { status: 400 });
    }

    // 将File对象转为ArrayBuffer再转成Buffer
    const arrayBuffer = await file.arrayBuffer();
    const buffer = Buffer.from(arrayBuffer);

    try {
        const pdfData = await pdfParse(buffer);
        return NextResponse.json({ text: pdfData.text });
    } catch (err) {
        console.error('PDF解析错误:', err);
        return NextResponse.json({ error: 'PDF解析失败' }, { status: 500 });
    }
}

2. 切换到Node.js Runtime(可选)

如果上述方法仍有问题,可以在路由文件顶部添加配置,强制使用Node.js Runtime——Edge Runtime对部分npm包兼容性有限,Node.js环境下兼容性更好:

export const runtime = 'nodejs'; // 添加这一行指定Runtime

import pdfParse from 'pdf-parse'
import { NextResponse, type NextRequest } from 'next/server';
 
export async function POST(request: NextRequest) {
    const formData = await request.formData();
    const file = formData.get('pdf') as File;
    
    if (!file) {
        return NextResponse.json({ error: '未上传文件' }, { status: 400 });
    }

    const arrayBuffer = await file.arrayBuffer();
    const buffer = Buffer.from(arrayBuffer);

    try {
        const pdfData = await pdfParse(buffer);
        return NextResponse.json({ text: pdfData.text });
    } catch (err) {
        console.error('PDF解析错误:', err);
        return NextResponse.json({ error: 'PDF解析失败' }, { status: 500 });
    }
}

3. 必须添加错误捕获

之前的代码没有错误捕获逻辑,一旦pdfParse抛出异常,Next.js会直接返回404(未处理的异常会导致路由处理失败)。添加try/catch后能明确错误原因,方便调试。

内容的提问来源于stack exchange,提问作者frankBang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:33:12