我尝试使用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类的新实例,该实例建立与数据库的新连接。我认为不希望与数据库建立多个连接。有没有人建议避免Sequelize类的多个实例?拥有多个实例甚至是一个大问题?
提前致谢!
答案 0 :(得分:3)
模块(文件)缓存在节点中:
模块在第一次加载后进行缓存。这意味着(除其他外)每次调用require(' foo')将获得完全相同的返回对象,如果它将解析为同一文件。
多次调用require(' foo')可能不会导致模块代码多次执行。这是一个重要的特征。有了它,"部分完成"可以返回对象,从而允许传递依赖性,即使它们会导致循环。
如果你想让模块多次执行代码,那么导出一个函数,并调用该函数。
https://nodejs.org/api/modules.html#modules_caching
这意味着models/index.js
上的代码只会运行一次