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

Next.js API中Puppeteer在Vercel部署时的500错误解决问询

解决方案

1. 替换依赖

卸载旧的适配包,改用维护版的Chromium适配工具和轻量版Puppeteer:

npm uninstall chrome-aws-lambda puppeteer
npm install @sparticuz/chromium puppeteer-core

2. 修正API路由代码

以下是适配Vercel Serverless环境的完整代码,同时修复了异步操作、参数解析的问题:

"use server";
import { NextResponse } from "next/server";
import puppeteer from "puppeteer-core";
import chromium from "@sparticuz/chromium";

export async function POST(req) {
  try {
    // 从POST请求体获取目标URL(POST参数不应从URL查询串读取)
    const { url } = await req.json();
    if (!url) {
      return NextResponse.json({ error: "缺少url参数" }, { status: 400 });
    }

    // 启动适配Vercel环境的Chromium
    const browser = await puppeteer.launch({
      args: chromium.args,
      defaultViewport: chromium.defaultViewport,
      executablePath: await chromium.executablePath(),
      headless: chromium.headless,
      ignoreHTTPSErrors: true,
    });

    const page = await browser.newPage();
    // 设置超时和等待策略,避免请求挂起
    await page.goto(url, { timeout: 30000, waitUntil: "networkidle2" });
    const buffer = await page.screenshot({ type: "png" });
    await browser.close();

    const base64Image = buffer.toString("base64");
    return NextResponse.json({ image: base64Image });
  } catch (error) {
    console.error("截图失败:", error);
    return NextResponse.json({ error: "截图失败" }, { status: 500 });
  }
}

3. Vercel部署配置调整

进入Vercel控制台的项目Functions设置,将该API路由的内存限制调整为1GB(默认512MB不足以运行Chromium)。

问题根源说明

  • 原版puppeteer自动下载的Chrome无法在Vercel Serverless环境持久化,且构建阶段下载受限
  • 旧版chrome-aws-lambda已停止维护,不兼容Next.js 13+的App Router打包机制
  • 原代码中puppeteer.launch()缺少await,导致异步操作未正确执行
  • POST参数解析逻辑错误:POST请求的参数应从请求体读取,而非URL查询串

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:55:38