如何访问与 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的fs路径问题

在Node.js应用中调用CICS JSON web service

如何将 Node.js 中的 net 模块与 browserify 一起使用?

Node.js——require加载规则