首页 > 解决方案 > 需要在节点中的类

问题描述

我试图在 Node 中的某些类中使用它们,但我通过一个包含所有个人需要的对象的文件来要求它们。像这样——

文件:/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'];

问题是,这工作得很好——但只适用于“类”变量中需要的第一个文件。任何需要也需要“类”的后续文件,最终只在“类”变量中保存一个空对象(不,实际变量名无关紧要,因为我尝试在第二个中使用不同的变量名文件,但它仍然最终存储了一个空对象)。例如,我经常需要我的 Controller 来实现一个 Model 类。

所以一旦 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”内部调用之后才可以。 js'。如果“console.log()”在“app.js”内部完成,或者直接调用“controller.js”而不是通过“app.js”,它将按预期打印出所有类。这就是我知道错误发生的位置/方式的方式。抛出的具体错误是 -

classes.Model is not a constructor

这就是我的问题/问题出现的地方,因为正如我所说,我已经在多个文件中调用了其他对象而没有遇到这个问题。所以它必须与类的实现方式有关,对吗?尽管我不了解它的工作原理,但我大致知道,当在 Node 中需要一个文件时,它对任何后续文件都使用相同的引用 - 对吗?所以我想它一定是这两件事的相互作用,但我不知道事后我是否正确地假设这是问题所在。

标签: javascriptnode.js

解决方案


你有一个循环依赖的require()语句。这会导致其中一个require()只返回一个空对象。你不能那样做。

在 controller.js 中,你有require('./classes.js');.

在 classes.js 中,你有require('./controller.js').

因此,每个都引用另一个,这就是导致循环依赖的原因。

您将需要重组代码在文件中的布局方式,这样您就没有这个了。有时,最简单的解决方法是将几个函数组合到一个文件中,而不是将它们全部放在容易受到此问题影响的单独文件中。我不太了解您的整体设计,不知道在这种情况下最好的建议是什么。

如果除了 controller.js 之外没有其他人真的会使用 classes.js,那么您可以将该代码移动到 controller.js 中(您不再需要在 controller.js 中要求)。


推荐阅读