如何在 Node.js 中引用父模块

Posted

技术标签:

【中文标题】如何在 Node.js 中引用父模块【英文标题】:How to reference parent modules in Node.js 【发布时间】:2015-04-20 18:53:02 【问题描述】:

我有几个文件,递归地相互要求。

routes.js 需要 api.jsapi.js 需要 upload.jspixels.js 等。

来自upload.jspixels.js 我想在api.js 中使用fn。

目前我要求这样,但它不起作用:

// routes.js
var api = require('./api');
api.upload.image(args); // a fn run from routes.js

.

// api.js
module.exports = 
    upload : require('./upload')

.

// pixels.js
module.exports = 
    get : function (args) 
          console.log(args);
    

.

// upload.js
var api = module.parent.exports;   // <= tricky part
module.exports = 
    image : function (args) 
          api.pixels.get(args); // <= api is undefined
    

module.parent.exports 在子模块中是空的,我不知道如何正确地require 它们。

我应该如何require 来获得这个功能?

【问题讨论】:

为什么upload : require('./upload');这一行的api.js里有;upload : require('./upload'); Node 通过从 require 返回一个不完整的模块来很好地支持循环需求,该模块稍后会被填充。请参阅nodejs.org/api/modules.html#modules_cycles @DanD。谢谢,有道理。知道如何解决这个问题吗? 似乎您需要以某种方式显式导出您的 api.js 的 exports 对象 再想一想——当你这样做时会发生什么?:var api = module.parent;——也就是说,去掉exports部分 【参考方案1】:

这个问题很老了,但我仍然会尝试回答。

代码序列

在 JS 中的代码执行不会立即发生在所有模块上。相反,它以严格的顺序发生。如果在查看需要和调用子模块的位置时考虑到这一点,那么当前结果是有意义的。虽然 OP 的示例没有明确显示需要子模块的位置,但我猜这发生在父模块的最开始,如下所示:

// api.js
const pixels = require('./pixels.js');
const upload = require('./upload.js');
module.exports = 
  pixels: pixels,

确实,当您需要 upload.js(第 3 行)时,api.js 对其未来的导出(如下所述)一无所知。

工作示例

基于这样的理解,我们来看一个稍微修改的代码:

// api.js
const pixels = require('./pixels.js');
module.exports = 
  pixels: pixels,

const upload = require('./upload.js');
let res = upload.image("test values");
console.log(res);

// pixels.js    
function get (args) 
  return "The result of processing " + args;

module.exports = 
  get: get
;

// upload.js    
const api = module.parent.exports;

module.exports = 
  image: function (args) 
      return api.pixels.get(args);
  

现在,当您在调用 upload 之前准备好您的 父模块导出 时,它不是 image 函数中的 undefined没有了。

如果你运行 api.js 你会得到:

处理测试值的结果

注意事项

    如果从多个模块和/或双向引用父级,事情可能会变得更加复杂。我想说这是项目结构糟糕的一个非常明显的迹象,应该对其进行重构并可能进行简化(以减少对父级引用的子级)。 module.parent 可能会事实上被弃用,因为它已经是discussed and announced to happen。

【讨论】:

以上是关于如何在 Node.js 中引用父模块的主要内容,如果未能解决你的问题,请参考以下文章

node.js 中的 module.parent 有啥用?如何引用 require()ing 模块?

在 Node.js 中,模块如何从应用程序的 package.json 中获取数据?

node.js的模块引用

如何学习Deno

在 Node.js 中,我如何知道 `this` 模块的路径?

如何在 node.js 中引入插件模块?