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

