我正在一台服务器上安装多个数据库。为了开始这个过程,我在index.js导出对象中分配了一个数据库,以便在构建系统时能够添加另一个数据库。以下是问题的描述。
当我运行server.js文件时,数据库db1的.sync函数同步Table1和Table2,然后开始监听其端口。它的clear server.js文件通过module.exports = db
接收var db = require('./models')
。但是在文件models/Table1.js中,服务器抛出一个错误TypeError: Cannot read property 'Table1' of undefined
。我确实在model s/Table1.js中检查了db的控制台输出,它是空的,因此在这个模型中不能访问它的clearmodule.exports = db
。
有人能提供解决方案来解决这个问题吗?
Table1.js模型和上面列出的其他文件的部分代码如下:
模型/表1.js
var db = require('./.')
[...]
var new_instance = db.db1.Table1.build({...})
服务器.js
var db = `require('./models')`
[...]
db.db1.sync(function(err) {});
模型/索引.js
var sq = new Sequelize(dbname, user, password, config);
db['db1'] = {
Sequelize: Sequelize,
sequelize: sq,
Table1: sq.import(__dirname + '/...'),
Table2: sq.import(__dirname + '/...')
}
module.exports = db;
最佳答案
正在访问module.exports = db
,但是您已经在models/index.js
和models/Table1.js
之间创建了一个循环依赖关系,因为在Table1.js
模型中您需要index.js
文件,而在index.js
文件中,您执行sequelize.import()
调用(执行require(path)
以包括模型定义),因此在您的情况下它调用require('./Table1.js')
-出现了循环依赖关系。
为了避免这种情况,您应该考虑将var new_instance = db.db1.Table1.build({...})
放在其他地方。带有模型定义的文件只能用于创建模型定义,请尽量避免执行其他操作。
看一看这个问题-How to deal with cyclic dependencies in Node.js了解如何处理这种情况。
编辑
根据您的评论,让我们考虑下面这个简单的例子
- script.js
- models
- index.js
- Table1.js
在
script.js
var db = require('./models');
var new_instance = db.db1.Table1.build({...});
如果您不需要将
script.js
放在models
目录中的任何文件中,则可以执行此操作。