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

Next.js 14(App Router)Vercel部署:找不到public文件夹

解决Next.js 14 App Router在Vercel部署后无法访问public私密文件夹的问题

Vercel部署后的目录结构说明

在Vercel上部署Next.js 14 App Router项目时,服务器端代码运行在/var/task目录下,这个目录对应项目的构建产物根目录。但禁止硬编码这个绝对路径——不同部署环境可能存在差异,且Next.js构建后public目录的定位需基于项目根目录动态生成,而非固定的/var/task/public,硬编码会直接导致路径匹配错误。

排查与修复步骤

1. 用动态路径拼接替代硬编码绝对路径

不要直接写'/var/task/public/myFiles'或'./public/myFiles',改用Node.js的path模块结合process.cwd()拼接路径,确保开发、生产环境都能精准定位文件:

import { readdir, stat } from 'fs/promises';
import path from 'path';

export async function GET() {
  // 动态生成public/myFiles的绝对路径
  const targetDir = path.join(process.cwd(), 'public', 'myFiles');

  try {
    // 先验证目录是否存在
    await stat(targetDir);
    const files = await readdir(targetDir);
    return new Response(JSON.stringify({ files }), { status: 200 });
  } catch (err) {
    return new Response(
      JSON.stringify({ error: (err as Error).message }),
      { status: 500 }
    );
  }
}

process.cwd()在开发环境返回项目根目录,在Vercel生产环境返回/var/task,以此拼接的路径在两种环境下都能生效。

2. 确认私密文件夹已被Vercel部署

  • 检查.gitignore文件,确保public/myFiles未被列入忽略列表;
  • 如果该文件夹是构建时生成的(比如从其他目录复制而来),需在package.json的build脚本中添加复制步骤,确保构建完成后文件被放到public/myFiles下:
{
  "scripts": {
    "build": "next build && cp -r ./path/to/generated/files ./public/myFiles"
  }
}

同时查看Vercel部署日志的构建阶段,确认public/myFiles目录及文件被正确复制到构建产物中。

3. 验证Vercel服务器端的文件结构

可在API路由中临时添加代码,打印当前工作目录和根目录文件,辅助排查:

// 临时排查代码,部署后可删除
const rootDir = process.cwd();
const rootFiles = await readdir(rootDir);
console.log('当前工作目录:', rootDir);
console.log('根目录内容:', rootFiles);

部署后到Vercel控制台的函数日志查看输出,确认public目录存在且public/myFiles在其中。若不存在,说明部署时该目录未被包含,需调整.gitignore或构建脚本。

4. 检查私密文件的访问权限

确保public/myFiles及其内部文件的权限设置正确,Vercel服务器端运行环境需要具备该目录的读取权限。如果是构建生成的文件,确保生成时设置了可读取权限(比如chmod 644)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:24:58