我正致力于在一台服务器上安装多个数据库。为了开始这个过程,我在 index.js 导出对象中分配了一个数据库,这样我就可以在构建系统时添加另一个数据库。下面是问题的描述。
当我运行 server.js 文件时,数据库 db1 的 .sync 函数会同步 Table1 和 Table2,然后开始监听其端口。很明显,server.js 文件正在通过 var db = require('./models')
接收 module.exports = db
。但是在文件 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({...})
服务器.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;
最佳答案
正在访问 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
目录中的任何文件中,则可以这样做。
关于javascript - Sequelize 和 Node.js : Issue with Module. 导出和表模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42771269/