我试图在 Node 中的某些类中进行 require,但我通过一个包含所有个人需求的对象的单个文件来要求它们。就像这样-
文件:/classes/controller.js
module.exports = class Controller {}
文件:/classes/model.js
module.exports = class Model {}
文件:/classes/classes.js
module.exports = {
Controller: require('./controller.js'),
Model: require('./model.js')
}
然后在app.js中
const classes = require('./classes/classes.js');
....code.....
....more code.....
const someController = new classes['Controller'];
问题是,这工作得很好 - 但仅适用于需要“classes”变量的第一个文件。任何需要“类”的后续文件最终只会在“类”变量中保存一个空对象(不,实际的变量名称并不重要,因为我尝试在第二个中使用不同的变量名称)文件,但它仍然最终存储一个空对象)。例如,我经常需要我的 Controller 来实现模型类。
一旦 app.js 调用controller.js,在其内部 -
文件:/classes/controller.js
const classes = require('./classes.js');
module.exports = class Controller {
constructor(var) {}
someMethod() {
....code....
const someModel = classes['Model'];
}
}
我可以调用“console.log(classes)”,它会打印出“{}”,但同样,这仅当它在“controller.js”内部完成并且仅在从内部调用之后才有效。 'app.js'。如果“console.log()”在“app.js”内部完成,或者直接调用“controller.js”而不是通过“app.js”,它将按预期打印出所有类。这就是我如何知道错误发生在哪里/如何发生的。抛出的具体错误是 -
classes.Model is not a constructor
这就是我的问题/问题出现的地方,因为正如我所说,我已经调用了多个文件中的其他对象,而从未遇到过这个问题。所以它一定与类的实现方式有关,对吗?尽管我不了解它如何工作的具体细节,但我大致知道当 Node 中需要一个文件时,之后它会对任何后续文件使用相同的引用 - 正确吗?所以我想这一定是这两件事的相互作用,但我不知道之后的事实,也不知道我是否正确地认为这就是问题所在。
最佳答案
您有 require()
语句的循环依赖。这会导致 require()
之一仅返回一个空对象。你不能这样做。
在controller.js内部,你有require('./classes.js');
。
在classes.js中,您有require('./controller.js')
。
因此,每个都引用另一个,这就是导致循环依赖的原因。
您将需要重新构建代码在文件中的布局方式,这样您就不会遇到这种情况。有时,最简单的解决方法是将几个函数合并到一个文件中,而不是将它们全部放在容易受到此问题影响的单独文件中。我不太了解您的整体设计,不知道在这种情况下最好建议什么。
如果除了controller.js之外没有其他人真的会使用classes.js,那么您可以将该代码移至controller.js(您不再需要在controller.js中进行require)。
关于javascript - 要求 Node 中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57487446/