如何在NextJS的/api路由中创建文件?
解决Vercel上Serverless函数无法创建目录的问题
我之前在Vercel部署Serverless函数时刚好踩过这个坑!Vercel的函数运行环境(基于AWS Lambda)除了特定的临时目录之外,整个文件系统都是只读的,所以你直接在项目目录下创建public文件夹肯定会触发EROFS报错。
核心解决方案:使用Vercel允许的可写临时目录
Vercel给Serverless函数开放了/tmp目录作为唯一可写的临时存储区域,空间上限是512MB。你只需要把创建目录的路径切换到这个目录下就行:
把原来的代码:
fs.mkdirSync(path.join(__dirname, "../../public"));
改成:
const tempPublicDir = path.join('/tmp', 'public'); fs.mkdirSync(tempPublicDir, { recursive: true });
这里加{ recursive: true }是为了确保如果父目录不存在的话也能自动创建,避免抛出"目录不存在"的额外错误。
完整的代码示例(/api/sendEmail.js)
const fs = require('fs'); const path = require('path'); export default async function handler(req, res) { try { // 创建临时public目录 const tempPublicDir = path.join('/tmp', 'public'); fs.mkdirSync(tempPublicDir, { recursive: true }); // 示例:在临时目录创建一个测试文件(比如邮件附件) const tempFilePath = path.join(tempPublicDir, 'email-attachment.txt'); fs.writeFileSync(tempFilePath, '这是邮件的临时附件内容'); // 这里执行你的发送邮件逻辑,比如读取tempFilePath作为附件 // ... // 可选:发送完成后清理临时文件(避免占用实例空间) fs.unlinkSync(tempFilePath); res.status(200).json({ message: '邮件发送成功' }); } catch (err) { console.error('发送邮件失败:', err); res.status(500).json({ errorMessage: err.message }); } }
额外注意事项
- 不要依赖
/tmp目录的持久化:这个目录的内容在函数实例销毁后会被清除,同一实例的后续调用可能会保留内容,但绝对不能把它当作持久存储来用。 - 如果需要持久化文件:比如需要长期保存生成的文件,建议使用云存储服务(比如Vercel Blob、AWS S3),而不是本地文件系统。
- 空间限制:
/tmp目录最多能使用512MB空间,如果处理大文件要注意不要超过这个上限。
内容的提问来源于stack exchange,提问作者Stevan Zečević
相关产品推荐
相关产品推荐

