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

NextJS 14.2.4部署Vercel后无法读取文件系统文件求助

问题分析与解决方案

核心问题原因

  1. 路径拼接错误:原代码中join(process.cwd() + "/public/Images/PostImages")是错误用法,path.join需传入多个路径片段而非预拼接字符串,这种写法在Vercel的Linux环境下可能生成无效路径(如出现重复斜杠)。
  2. public目录的用途误解:Next.js的public目录是静态资源托管目录,部署后资源会被CDN处理,而非保留原文件系统路径,直接读取public下的Markdown文件在Vercel环境中会找不到对应路径。
  3. 同步IO的适配问题:本地环境中同步文件读取可正常运行,但Vercel的无服务器函数环境更适配异步IO操作,同步方法可能触发路径解析异常。

修正后的代码实现

首先将Markdown文件从public/Posts迁移到项目根目录的content/posts(确保该目录未被.gitignore排除),图片可保留在public/Images/PostImages,然后修改读取逻辑:

import { join } from 'path';
import { readdir, readFile } from 'fs/promises';
import matter from 'gray-matter';

// 读取源码目录下的Markdown文件
const postsPath = join(process.cwd(), 'content', 'posts');
// 读取public下的图片目录
const imagesPath = join(process.cwd(), 'public', 'Images', 'PostImages');

export default async function PostMapper() {
  const files = await readdir(postsPath);
  const images = await readdir(imagesPath);

  const posts = await Promise.all(files.map(async (fileName) => {
    const slug = fileName.replace('.md', '');
    const filePath = join(postsPath, fileName);
    const fileContent = await readFile(filePath, 'utf8');
    const { data: frontmatter, content } = matter(fileContent);
    
    return {
      slug,
      frontmatter,
      content,
      images,
    };
  }));

  return posts;
}

额外排查步骤

  • 查看Vercel构建日志:在函数中添加console.log(process.cwd()),确认部署环境下的项目根目录路径是否符合预期。
  • 检查Vercel项目文件列表:确认content/posts目录及文件已被正确部署到服务器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:55:00