避免 Sequelize 类的多个实例

Posted

技术标签:

【中文标题】避免 Sequelize 类的多个实例【英文标题】:Avoiding multiple instances of the Sequelize class 【发布时间】:2015-11-01 17:57:45 【问题描述】:

我正在尝试使用 Express 和 Sequelize 构建一个基本的数据库架构。我在单独的文件中定义所有模型。我有一个文件 (models/index.js),在其中创建 Sequelize 类的实例、导入模型并建立模型之间的关系。我还有多个控制器,每个控制器都需要访问从models/index.js 导出的模型。

这是导入模型的文件:

// models/index.js

var Sequelize = require('sequelize');
var sequelize = new Sequelize('myApp', 'username', 'password');

var User = sequelize.import('./users');
var Contact = sequelize.import('./contacts');
var Conversation = sequelize.import('./conversations');
var Medium = sequelize.import('./mediums');

User.hasMany(Contact);
Contact.belongsTo(User);

Contact.hasMany(Conversation);
Conversation.belongsTo(Contact);

Medium.hasMany(Conversation);
Conversation.belongsTo(Medium);

module.exports.Sequelize = Sequelize;
module.exports.sequelize = sequelize;

module.exports.User = User;
module.exports.Contact = Contact;
module.exports.Conversation = Conversation;
module.exports.Medium = Medium;

这是需要访问模型的控制器之一。

// controllers/users.js

var models = require('../models');

module.exports.addUser = function () 
;

module.exports.getUser = function () 
;

这是另一个需要访问模型的控制器。

// controllers/contacts.js

var models = require('../models');

module.exports.addContact = function () 
;

module.exports.getContact = function () 
;

module.exports.getAllContacts = function () 
;

我担心两个控制器都需要models/index.js 文件这一事实。每次需要models/index.js 文件时,都会创建一个新的 Sequelize 类实例,从而建立与数据库的新连接。有没有人有任何建议来?

提前致谢!

【问题讨论】:

你可能想看看here 【参考方案1】:

模块(文件)缓存在节点中:

模块在第一次加载后被缓存。这意味着(除其他外)每次调用 require('foo') 都将返回完全相同的对象,如果它会解析为同一个文件。

多次调用 require('foo') 可能不会导致模块代码被多次执行。这是一个重要的特点。有了它,可以返回“部分完成”的对象,从而允许加载传递依赖,即使它们会导致循环。

如果你想让一个模块多次执行代码,那么导出一个函数,然后调用那个函数。

https://nodejs.org/api/modules.html#modules_caching

这意味着models/index.js 上的代码只会运行一次

【讨论】:

以上是关于避免 Sequelize 类的多个实例的主要内容,如果未能解决你的问题,请参考以下文章

避免 Singleton 的多个实例? [复制]

实例化创建线程的类的多个实例......?

Sequelize:跨多个数据库的关系时“模型尚未定义”

创建一个子类的多个实例,只有一个超类的实例

sequelize模型

如何在 C++ 中创建一个类的多个实例