首页 文章

避免Sequelize类的多个实例

提问于
浏览
0

我正在尝试使用Express和Sequelize构建一个基本的数据库模式 . 我在单独的文件中定义所有模型 . 我有一个文件( models/index.js ),我在其中创建Sequelize类的实例,导入模型,并 Build 模型之间的关系 . 我还有多个控制器,每个控制器都需要访问从 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类的新实例,该实例将 Build 与数据库的新连接 . 我的印象是不希望与数据库 Build 多个连接 . 有没有人建议避免Sequelize类的多个实例?拥有多个实例甚至是一个大问题?

提前致谢!

1 回答

  • 3

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

    模块在第一次加载后进行缓存 . 这意味着(除其他外)每次调用require('foo')将获得完全相同的返回对象,如果它将解析为同一个文件 . 多次调用require('foo')可能不会导致模块代码多次执行 . 这是一个重要特征 . 有了它,就可以返回“部分完成”的对象,从而允许加载传递依赖,即使它们会导致循环 . 如果要让模块多次执行代码,则导出一个函数,然后调用该函数 .

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

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

相关问题