我正在一台服务器上安装多个数据库。为了开始这个过程,我在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.jsmodels/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目录中的任何文件中,则可以执行此操作。

08-06 01:45