在Vercel部署的Next.js API路由中使用FileSystem方法(如readdirSync)出现500错误的问题咨询
你遇到的核心问题是: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

