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

How to reference parent modules in Node.js

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

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获得此功能?

这个问题很老了,但我还是会尽力回答的。

代码序列

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);
  }
}

现在,当您在调用 上传 之前准备好 父模块导出 时,它不是 未定义image 函数中。

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

The result of processing test values

备注

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