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

ESM下使用import.meta.url加载上级目录JSON文件报错如何解决?

问题原因

path.resolve仅支持处理无协议前缀的本地文件系统路径字符串,而import.meta.url返回的是带file://协议的标准URL格式字符串,两者直接混用会导致路径解析失败。同时URL构造函数要求第二个参数为合法URL格式值,传入path.resolve返回的本地路径自然会报错。

正确实现方案

方案1:直接使用URL原生相对路径(最简写法,无需额外依赖)

URL构造函数本身就支持相对路径解析,直接在第一个参数写../即可识别上级目录:

import fs from 'fs';

const result = fs.readFileSync(
  new URL("../abc.json", import.meta.url)
);

如果需要拿到JSON对象,自行调用JSON.parse即可:

const jsonData = JSON.parse(result.toString());

方案2:结合path模块处理(适合复杂路径场景)

如果需要做多层路径计算等更复杂的逻辑,可以先把import.meta.url转换为本地文件路径再处理:

import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';

// 将当前模块URL转换为本地绝对文件路径
const __filename = fileURLToPath(import.meta.url);
// 获取当前模块所在的目录路径
const __dirname = path.dirname(__filename);
// 拼接上级目录的abc.json路径
const targetPath = path.resolve(__dirname, '../abc.json');

const result = fs.readFileSync(targetPath);

补充优化

如果使用Node.js v17.1.0及以上版本,可以直接用ESM语法导入JSON文件,不需要手动读文件解析:

import abcConfig from '../abc.json' assert { type: 'json' };

导入的abcConfig直接就是解析完成的JS对象,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:06:02