我正在一个服务器上安装多个数据库。为了开始这个过程,我在index.js导出对象中分配了一个数据库,这样我就可以在构建系统时添加另一个数据库。以下是问题的描述。
当我运行server.js文件时,数据库db1的.sync函数同步Table1和Table2,然后开始侦听其端口。很明显, server.js 文件正在通过module.exports = db
接收var db = require('./models')
。但是,在文件 models / Table1.js 中,服务器会抛出错误TypeError: Cannot read property 'Table1' of undefined
。我确实在 models / Table1.js 中检查了db的控制台输出,并且它是空的,因此在此模型中无法访问其清除module.exports = db
。
有人可以提供解决方案来解决此问题吗?
上面列出的Table1.js模型和其他文件的部分代码如下:
模型/ Table1.js
var db = require('./.')
[...]
var new_instance = db.db1.Table1.build({...})
server.js
var db = `require('./models')`
[...]
db.db1.sync(function(err) {});
模型/ index.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;
答案 0 :(得分:1)
正在访问module.exports = db
,但您已在models/index.js
和models/Table1.js
之间创建了循环依赖关系,因为您需要Table1.js
模型{{1}在index.js
文件中执行index.js
调用,执行sequelize.import()
以包含模型定义,所以在你的情况下调用require(path)
- 出现循环依赖。
您应该考虑将require('./Table1.js')
放在其他地方,以避免出现这种情况。具有模型定义的文件应仅用于创建模型定义,尽量避免执行其他操作。
看一下这个问题 - How to deal with cyclic dependencies in Node.js,了解如何应对这种情况。
修改强>
根据您的评论,让我们考虑以下结构的简单示例
var new_instance = db.db1.Table1.build({...})
在- script.js
- models
- index.js
- Table1.js
script.js
如果您不要求var db = require('./models');
var new_instance = db.db1.Table1.build({...});
目录中放置的任何文件中的script.js
,就可以完成。