如何在 Node.js 中引用父模块
How to reference parent modules in Node.js
我有几个文件,递归地互相要求。
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
获得此功能?
这个问题很老了,但我还是会尽力回答的。
代码序列
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
备注
- 如果从多个模块 and/or 双向引用父级,事情可能会变得更加复杂。我想说这是糟糕项目结构的一个非常明显的迹象,它应该被重构并可能被简化(以减少父引用的子项)。
- module.parent 可能会 事实上 已弃用,因为它已经 discussed and announced to happen.
我有几个文件,递归地互相要求。
routes.js
需要 api.js
.
api.js
需要 upload.js
、pixels.js
等
来自 upload.js
或 pixels.js
我想在 api.js
.
目前我是这样要求的,但它不起作用:
// 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
备注
- 如果从多个模块 and/or 双向引用父级,事情可能会变得更加复杂。我想说这是糟糕项目结构的一个非常明显的迹象,它应该被重构并可能被简化(以减少父引用的子项)。
- module.parent 可能会 事实上 已弃用,因为它已经 discussed and announced to happen.