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

Node.js require()传入变量路径无法读取JSON文件问题

问题原因

Node.js的require对路径的解析逻辑分两种情况:

  • 当传入字符串字面量(比如require("./smallsample.json"))时,Node会以当前模块文件所在的目录作为基准来解析相对路径。
  • 当传入变量时,Node会把相对路径的基准目录换成当前进程的工作目录(process.cwd()),哪怕变量的值和字面量完全一致,解析后的实际路径也可能不一样,这就是为什么会出现找不到模块的错误。
解决方案

给出几个实用的解决方法:

  • 用__dirname拼接绝对路径:__dirname是Node.js提供的内置变量,代表当前模块文件所在的目录,用它拼接路径能确保解析基准正确:
const path = require('path');
const jsonDir = path.join(__dirname, './smallsample.json');
const data = require(jsonDir);
  • ES模块环境下用import.meta.url适配:如果你的项目用ES模块("type": "module"),可以用以下方式获取模块目录:
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import fs from 'fs/promises';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const jsonDir = join(__dirname, './smallsample.json');
// ES模块更推荐用fs读取解析,对require的支持有限
const data = JSON.parse(await fs.readFile(jsonDir, 'utf8'));
  • 直接用fs模块读取解析:绕开require的路径解析规则,直接读取文件并解析JSON,这种方式更直观:
const fs = require('fs');
const path = require('path');
const jsonDir = path.join(__dirname, './smallsample.json');
const data = JSON.parse(fs.readFileSync(jsonDir, 'utf8'));

你可以打印process.cwd()和__dirname对比一下,就能清楚看到两个目录的差异,验证这个问题的根源。

内容的提问来源于stack exchange,提问作者Luis Manuel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:04:53