如何访问与 Node 中的调用模块相关的 JSON 文件?
Posted
技术标签:
【中文标题】如何访问与 Node 中的调用模块相关的 JSON 文件?【英文标题】:How do I access a JSON file relative to my calling module in Node? 【发布时间】:2021-10-27 02:06:11 【问题描述】:我正在定义一个包 PackageA,它具有一个函数 (parseJson),该函数接受一个 json 文件的文件路径以进行解析。在另一个包 PackageB 中,我希望能够使用我通过 PackageB 的本地路径指定的文件来调用 PackageA。例如,如果 file.json 与 packageB 位于同一目录中,我希望能够调用 PackageA.parseJson('./file.json')
,而无需在 PackageB 中添加任何额外代码。我该怎么做?看来require
需要从PackageA 到文件的路径,这不是我想要的。
编辑:目前,parseJson 看起来像这样:
public parseJson(filepath)
let j = require(filepath);
console.log(j);
PackageB 是这样称呼它的:
let a = new PackageA();
a.parseJson("./file.json");
file.json 与 PackageB 位于同一目录中。
【问题讨论】:
请与我们分享您的锻炼、代码 sn-ps、错误日志或任何有用的信息,以帮助回答您的问题。 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:CommonJS 模块在其作用域内有 __dirname
变量,包含指向它们所在目录的路径。
要获得RELATIVE_PATH
的绝对路径,请使用join(__dirname, RELATIVE_PATH)
(join
from path
module)。
示例:
// PackageB .js file
const Path = require('path')
const PackageA = require(/* PackageA name or path */)
const PackageB_jsonPathRelative = /* relative path to json file */
// __dirname is directory that contains PackageB .js file
const PackageB_jsonPathAbsolute = Path.join(__dirname, PackageB_jsonPathRelative)
PackageA.parseJson(PackageB_jsonPathAbsolute)
更新
如果您无法更改 PackageB,但您确切知道 PackageB 如何调用 PackageA.parseJson
(例如直接调用,或通过包装器,但深度已知),那么您可以从 stack-trace 获取到 PackageB 的路径。
示例:
// PackageA .js file
// `npm install stack-trace@0.0.10` if you have `ERR_REQUIRE_ESM` error
const StackTrace = require('stack-trace')
const Path = require('path')
const callerFilename = (skip=0) => StackTrace.get(callerFilename)[skip + 1].getFileName()
module.exports.parseJson = (caller_jsonPathRelative) =>
// we want direct caller of `parseJson` so `skip=0`
// adjust `skip` parameter if caller chain changes
const callerDir = Path.dirname(callerFilename())
// absolute path to json file, from relative to caller file
const jsonPath = Path.join(callerDir, caller_jsonPathRelative)
console.log(jsonPath)
console.log(JSON.parse(require('fs').readFileSync(jsonPath)))
【讨论】:
非常感谢您的帮助,非常感谢!如果不对 PackageB 的内容进行任何更改,我将如何实现这一点?即,仅通过更改 PackageA 的 parseJson 方法。以上是关于如何访问与 Node 中的调用模块相关的 JSON 文件?的主要内容,如果未能解决你的问题,请参考以下文章
在 Node.js 中,模块如何从应用程序的 package.json 中获取数据?
如何访问和测试 node.js 模块中的内部(非导出)函数?
在Node.js应用中调用CICS JSON web service