javascript - 需要在节点中的类
问题描述
我试图在 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 中需要一个文件时,它对任何后续文件都使用相同的引用 - 对吗?所以我想它一定是这两件事的相互作用,但我不知道事后我是否正确地假设这是问题所在。
解决方案
你有一个循环依赖的require()
语句。这会导致其中一个require()
只返回一个空对象。你不能那样做。
在 controller.js 中,你有require('./classes.js');
.
在 classes.js 中,你有require('./controller.js')
.
因此,每个都引用另一个,这就是导致循环依赖的原因。
您将需要重组代码在文件中的布局方式,这样您就没有这个了。有时,最简单的解决方法是将几个函数组合到一个文件中,而不是将它们全部放在容易受到此问题影响的单独文件中。我不太了解您的整体设计,不知道在这种情况下最好的建议是什么。
如果除了 controller.js 之外没有其他人真的会使用 classes.js,那么您可以将该代码移动到 controller.js 中(您不再需要在 controller.js 中要求)。
推荐阅读
- python - kedro:使用 keras ImageDataGenerator 训练图像分类器
- python - 向openpyxl趋势线添加“线性”以外的趋势线类型会导致错误
- r - dplyr 函数内部行为不一致
- spring-boot - spring.profiles.include 不能与 spring 云配置服务器一起使用?
- reactjs - 如何在 redux 中处理多个输入值?
- html - 直接在源标签中使用媒体或宽度的区别
- c# - 在 OpenAPI / Swagger 中按名称排序方法
- r - R - 有条件的替换
- boolean-logic - 为什么(A或B)和((不是A)或C)=(A或B)和((不是A)或C)和(B或C)?
- terraform - 地形执行