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

在Node.js中如何访问相对于调用模块的JSON文件

问题根源

Node.js 中 require 方法的相对路径解析逻辑是相对于编写 require 语句的模块文件所在目录,你在 PackageA 内部调用 require,自然会基于 PackageA 的目录寻址,无法匹配 PackageB 传入的相对路径。

解决方案

以下两种方案都无需修改 PackageB 侧的调用代码:

方案1:基于进程工作目录解析

适合 PackageB 是直接运行的应用、启动目录固定为 PackageB 根目录的场景
放弃使用 require 加载JSON,改用fs模块读取文件后用JSON.parse解析,路径基于process.cwd()(当前Node进程的启动目录)拼接:

const fs = require('fs');
const path = require('path');

public parseJson(filepath) {
    // 拼接得到文件绝对路径
    const fullPath = path.resolve(process.cwd(), filepath);
    // 读取并解析JSON
    const jsonContent = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));
    console.log(jsonContent);
}

方案2:基于调用方文件目录解析

适合所有场景,不受进程启动位置影响,相对路径始终相对于调用parseJson方法的文件所在目录
通过调用栈提取调用方的文件路径,再基于调用方所在目录拼接传入的相对路径:

const fs = require('fs');
const path = require('path');

public parseJson(filepath) {
    // 通过错误栈获取调用方信息
    const stackLines = new Error().stack.split('\n');
    // 第三行对应调用方的栈信息,适配Node.js 12+标准栈格式
    const callerLine = stackLines[2];
    // 提取调用方的文件绝对路径
    const callerFilePath = callerLine.match(/\((.*):\d+:\d+\)/)[1];
    // 得到调用方文件所在目录
    const callerDir = path.dirname(callerFilePath);
    // 拼接目标JSON文件的绝对路径
    const fullPath = path.resolve(callerDir, filepath);
    const jsonContent = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));
    console.log(jsonContent);
}

提示:如果运行环境的错误栈格式特殊,调整正则匹配规则提取调用方路径即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:09:03