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
相关产品推荐
相关产品推荐

