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

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

routes.js 需要 api.js
api.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部分

标签: node.js require node-modules


【解决方案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 你会得到:

处理测试值的结果

注意事项

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-14
    • 2020-01-15
    • 2017-12-12
    • 2021-08-21
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多