【问题标题】:Sequelize and Node.js: Issue with Module.Exports and Table ModelsSequelize 和 Node.js:Module.Exports 和表模型的问题
【发布时间】:2017-03-13 18:50:48
【问题描述】:

我正在努力在一台服务器上安装多个数据库。为了开始这个过程,我在 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({...})

server.js

var db = `require('./models')`
[...]
db.db1.sync(function(err) {});

models/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;

【问题讨论】:

    标签: javascript mysql node.js sequelize.js


    【解决方案1】:

    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({...});
    

    如果您models 目录中的任何文件中需要script.js,则可以这样做。

    【讨论】:

    • var new_instance = db.db1.Table1.build({...}) 的代码可以放在脚本中保存数据到数据库吗?
    • 感谢您的明确回答和解释。你知道直到今天我的印象是,所有的数据库保存命令都必须在模型中执行。我能够根据您的指导重写系统的逻辑并且它起作用了。太棒了,做得好!
    猜你喜欢
    • 2018-01-23
    • 2020-11-09
    • 2016-03-02
    • 2020-10-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    相关资源
    最近更新 更多