在Vercel部署NextJS时出现ENOENT创建目录错误求助
问题:Next.js部署到Vercel后创建目录失败(已用recursive参数仍报ENOENT)
本地localhost运行正常的代码如下:
import fs from 'fs' import path from 'path' export default function createUserDir (tokenSignature: string) { const pathToMakeDir = path.join(process.cwd(), 'notes', tokenSignature); fs.mkdirSync(pathToMakeDir, { recursive: true }); }
部署到Vercel(Next.js 13.0.3,Node 16.x)后出现如下错误:
2022-11-15T19:32:34.119Z 145c46ab-416c-4f5c-b881-80b9c623a5ac ERROR Error: ENOENT: no such file or directory, mkdir '/var/task/notes/jFlqLkrmIPOEnaiExiUN3ohlmJlH_GN2OD36fiQ9a2A' at Object.mkdirSync (node:fs:1349:3) at createUserDir (/var/task/.next/server/chunks/133.js:252:45) at getServerSideProps (/var/task/.next/server/pages/index.js:93:76) at Object.renderToHTML (/var/task/node_modules/next/dist/server/render.js:506:26) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async doRender (/var/task/node_modules/next/dist/server/base-server.js:701:34) at async cacheEntry.responseCache.get.isManualRevalidate.isManualRevalidate (/var/task/node_modules/next/dist/server/base-server.js:806:28) at async /var/task/node_modules/next/dist/server/response-cache/index.js:80:36 { errno: -2, syscall: 'mkdir', path: '/var/task/notes/jFlqLkrmIPOEnaiExiUN3ohlmJlH_GN2OD36fiQ9a2A', page: '/' } RequestId: 145c46ab-416c-4f5c-b881-80b9c623a5ac Error: Runtime exited with error: exit status 1 Runtime.ExitError
解决方案
- 核心原因:Vercel的
/var/task目录是只读的,无法写入文件或创建目录;本地环境中process.cwd()指向有写入权限的项目目录,因此本地运行正常。 - 临时存储修改:改用Vercel允许写入的临时目录
/tmp,调整代码路径:
注意:import fs from 'fs' import path from 'path' export default function createUserDir (tokenSignature: string) { const pathToMakeDir = path.join('/tmp', 'notes', tokenSignature); fs.mkdirSync(pathToMakeDir, { recursive: true }); }/tmp目录的内容会在函数执行结束后被自动清理,仅适合临时存储场景。 - 持久化存储方案:如果需要长期保存文件,应使用Vercel官方Blob Storage或第三方云存储服务(如AWS S3),Vercel的Serverless函数环境不提供持久化本地存储能力。
内容的提问来源于stack exchange,提问作者JoaoPedroMatias
相关产品推荐
相关产品推荐

