You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:40:23