NestJS部署至Vercel时出现ENOENT文件不存在错误求助
Vercel生产环境无法读取本地JSON文件的解决方案
问题核心
Vercel生产环境运行的是构建后的产物包,而非原始源码目录:
process.cwd()在生产环境指向服务器工作目录,不是本地项目根目录,导致路径拼接完全失效;- src目录下的非源码文件(如JSON)可能未被构建工具纳入最终产物,自然无法读取。
可行解决方案
1. 基于模块位置计算路径
抛弃process.cwd(),改用当前执行文件的目录路径拼接目标文件,路径计算更稳定:
- CommonJS环境:
const path = require('path'); const { readFile } = require('fs/promises'); const data = await readFile(path.join(__dirname, '../test/data/test/test.json'), 'utf8');
- ES模块环境:
import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import { readFile } from 'fs/promises'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const data = await readFile(join(__dirname, '../test/data/test/test.json'), 'utf8');
2. 静态导入JSON文件
如果JSON内容体积不大,直接用静态导入替代文件读取,构建工具会自动处理路径并打包内容:
import testData from './src/test/data/test/test.json';
这种方式无需手动处理路径,本地和生产环境均能无缝运行。
3. 迁移至public目录托管
Vercel会自动托管public目录下的所有静态资源,将JSON文件移至public/data/test.json后:
- 服务器端读取:
const data = await readFile(join(process.cwd(), 'public/data/test.json'), 'utf8');
- 客户端直接请求:
const res = await fetch('/data/test.json'); const data = await res.json();
4. 强制纳入构建产物
若必须保留原目录结构,可通过构建配置强制复制JSON文件。以Next.js为例,修改next.config.js:
const CopyWebpackPlugin = require('copy-webpack-plugin'); module.exports = { webpack: (config) => { config.plugins.push( new CopyWebpackPlugin({ patterns: [ { from: './src/test/data/test/test.json', to: './' }, ], }) ); return config; }, };
内容的提问来源于stack exchange,提问作者mohammed salman ali pary
相关产品推荐
相关产品推荐

