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

在Vercel部署的Next.js API路由中使用FileSystem方法(如readdirSync)出现500错误的问题咨询

解决Next.js API路由在Vercel部署后fs.readdirSync找不到目录的问题

你遇到的核心问题是:Vercel的Serverless函数运行环境中,无法访问本地存在的_posts/_projects目录。这是因为Vercel默认不会把这类自定义非标准目录打包进API函数的运行资源包中,而本地运行时这些目录直接在项目根目录下,所以能正常读取。下面是几个针对性的解决方案:

1. 通过vercel.json强制包含自定义目录

这是最直接的解决方式,通过配置文件告诉Vercel在部署搜索API时,将需要的目录一并打包。

在项目根目录创建或修改vercel.json文件,添加以下内容:

{
  "functions": {
    "pages/api/search.ts": {
      "includeFiles": "_posts/**/*,_projects/**/*"
    }
  }
}

这个配置会让Vercel在部署pages/api/search.ts这个API函数时,把_posts和_projects下的所有文件都包含到函数运行包中,确保fs.readdirSync能找到目标目录。

2. 检查.gitignore是否排除了目标目录

很多开发者会不小心把内容目录加入.gitignore,导致Vercel拉取代码时根本不会同步这些目录。打开你的.gitignore文件,确认里面没有_posts/或_projects/这类规则,如果有,删除后重新部署即可。

3. 调整路径计算逻辑(备选方案)

有时候process.cwd()在Serverless环境中的指向可能和预期有差异,你可以改用__dirname来精准定位目录。假设你的getAllArticles函数在utils/articles.ts中,修改路径计算代码:

import path from 'path';

export const getAllArticles = (
  type: ArticleTypes,
  items?: string[],
  filters?: IFilters,
): IArticle[] => {
  // 用__dirname定位到项目根目录下的目标文件夹
  const articlesPath = path.resolve(__dirname, `../_${type}`);
  // 如果utils目录在src下,就调整为../../_${type},以此类推
  // ... 剩余代码保持不变
};

__dirname指向当前模块所在的目录,通过向上回溯可以精准定位到项目根目录下的_posts/_projects。

验证配置是否生效

部署完成后,进入Vercel控制台找到对应的API函数,切换到「Files」标签页,查看是否存在_posts和_projects目录。如果能看到,说明配置已生效,再测试搜索接口即可正常返回结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:04:07