Sequelize和Node.js:Module.Exports和Table Models

时间:2017-03-13 18:50:48

标签: javascript mysql node.js sequelize.js

我正在一个服务器上安装多个数据库。为了开始这个过程,我在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;

1 个答案:

答案 0 :(得分:1)

正在访问module.exports = db,但您已在models/index.jsmodels/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,就可以完成。