如何在 Node.js 中引用父模块
Posted
技术标签:
【中文标题】如何在 Node.js 中引用父模块【英文标题】:How to reference parent modules in Node.js 【发布时间】:2015-04-20 18:53:02 【问题描述】:我有几个文件,递归地相互要求。
routes.js
需要 api.js
。api.js
需要 upload.js
、pixels.js
等。
来自upload.js
或pixels.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 中获取数据?