javascript - Sequelize 和 Node.js : Issue with Module. 导出和表模型

标签 javascript mysql node.js sequelize.js

我正致力于在一台服务器上安装多个数据库。为了开始这个过程,我在 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.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 目录中的任何文件中,则可以这样做。

关于javascript - Sequelize 和 Node.js : Issue with Module. 导出和表模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42771269/

相关文章:

mysql - 更改列类型smallint(5) 到int(11) 太慢了?

MySQL 重复事件停止工作

javascript - 从任何目录运行 Node.JS 脚本?

node.js - Client_id 和 Client_secret 参数在 token 交换端点中未定义

node.js - 为什么我的 socket.io 事件会成 block 地发生?

javascript - jQuery .animate() 问题,<p> 标签正在移动

javascript - ngTagsInput 未绑定(bind)到模型

用于移动浏览器中文本突出显示工具提示的 Javascript

javascript 相等返回 false

mysql - 为什么肝脏服务器上仍然显示@localhost