在Vercel部署Next.js应用时遭遇ENOENT文件不存在错误
Vercel部署Next.js应用后文件找不到问题
错误详情
部署后后端访问文件时出现以下错误:
[Error: ENOENT: no such file or directory, open '/var/task/problems/add-two-numbers/boilerplate-full/function.java'] { errno: -2, code: 'ENOENT', syscall: 'open', path: '/var/task/problems/add-two-numbers/boilerplate-full/function.java', digest: '3522486023' }
本地开发环境中文件存在且运行正常,但Vercel上无法找到/var/task/problems目录下的.java等文件。
项目结构
next-app: --problems: ----add-two-numbers: ------boilerplate-full: --------function.java --------function.py --------function.js ------inputs: --------0.txt --------1.txt ------outputs: --------0.txt --------1.txt ----other-problems: --src: ----actions: ------problem.js: ----app: ------problem/[...problemSlug]/page.js ------page.jsx ------layout.jsx
相关代码(src/actions/problem.js)
"use server"; import fs from "fs"; import path from "path"; import { LanguagesToExtension } from "./types"; const MOUNT_PATH = path.join(process.cwd(), "problems"); export const getProblem = async (problemSlug, languageId) => { languageId = LanguagesToExtension[languageId]; const fullBoilderPlate = await getProblemFullBoilerplateCode( problemSlug, languageId ); const inputs = await getProblemInputs(problemSlug); const outputs = await getProblemOutputs(problemSlug); return { id: problemSlug, fullBoilerplateCode: fullBoilderPlate, inputs: inputs, outputs: outputs, }; }; async function getProblemFullBoilerplateCode(problemSlug, languageId) { return new Promise((resolve, reject) => { fs.readFile( `${MOUNT_PATH}/${problemSlug}/boilerplate-full/function.${languageId}`, { encoding: "utf-8" }, (err, data) => { if (err) { reject(err); } resolve(data); } ); }); } async function getProblemInputs(problemSlug) { return new Promise((resolve, reject) => { fs.readdir( `${MOUNT_PATH}/${problemSlug}/tests/inputs`, async (err, files) => { if (err) { console.log(err); } else { await Promise.all( files.map((file) => { return new Promise((resolve, reject) => { fs.readFile( `${MOUNT_PATH}/${problemSlug}/tests/inputs/${file}`, { encoding: "utf-8" }, (err, data) => { if (err) { reject(err); } resolve(data); } ); }); }) ) .then((data) => { resolve(data); }) .catch((e) => reject(e)); } } ); }); } async function getProblemOutputs(problemSlug) { return new Promise((resolve, reject) => { fs.readdir( `${MOUNT_PATH}/${problemSlug}/tests/outputs`, async (err, files) => { if (err) { console.log(err); } else { await Promise.all( files.map((file) => { return new Promise((resolve, reject) => { fs.readFile( `${MOUNT_PATH}/${problemSlug}/tests/outputs/${file}`, { encoding: "utf-8" }, (err, data) => { if (err) { reject(err); } resolve(data); } ); }); }) ) .then((data) => { resolve(data); }) .catch((e) => reject(e)); } } ); }); }
已尝试的路径写法
此前problems文件夹位于src目录下,曾尝试以下路径配置:
const MOUNT_PATH = path.relative(__dirname,"src","problems");const MOUNT_PATH = path.join("src", "problems");
已确认信息
- 文件路径本地验证正确
- 文件已提交至GitHub并包含在构建产物中
- 怀疑问题与Vercel文件系统或配置有关
内容的提问来源于stack exchange,提问作者Chaman Chaudhary
相关产品推荐
相关产品推荐

