node.js - 在项目中多次实例化 Sequelize 连接:这是一个坏主意吗?
问题描述
我对这个问题的目标是以安全和可持续的方式实现在我的 node.js(不是打字稿)项目中使用 VS Code 智能感知和 Sequelize 模型定义。
可以构建Sequelize模型
- 通过钩子,或
- 通过扩展模型类。
使用钩子创建的模型不会被智能感知理解,所以我在下面重点关注后者。
Sequelize 模型构造函数需要配置的 Sequelize 连接实例。至少有两种方法可以解决这个问题。
A - 在每个模型旁边实例化 sequelize(即:多次)
模型定义的一个记录示例:
const { Sequelize, DataTypes, Model } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory');
class User extends Model {}
User.init({
// Model attributes are defined here
firstName: {
type: DataTypes.STRING,
allowNull: false
},
lastName: {
type: DataTypes.STRING
// allowNull defaults to true
}
}, {
// Other model options go here
sequelize, // We need to pass the connection instance
modelName: 'User' // We need to choose the model name
});
在此示例中,sequelize
连接在模型定义旁边的同一文件中实例化。
我们可以在许多模型定义文件中准确地重复这一点。然后每个文件都可以导出一个模型类,调用者可以直接使用该类。
Intellisense 将理解此设置。
B - 实例化 sequelize 一次,然后传递它
Sequelize CLI 促进了以下项目结构:
- 每个模型定义文件都导出一个构建类的函数
Model
。该函数接受sequelize
实例作为参数。 models/index.js
文件实例化sequelize
——项目中唯一发生这种情况的地方。然后调用每个模型定义函数,并将此sequelize
实例传递给该函数。- 生成的模型全部由
models/index.js
.
似乎智能感知不理解这一点,并且无法从这些由函数创建的导出中跟踪类方法。
以下是User.js
Sequelize CLI 为与上述示例完全相同的模型创建的文件:
"use strict";
const { Model } = require("sequelize");
module.exports = (sequelize, DataTypes) => {
class User extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here
}
}
User.init(
{
firstName: DataTypes.STRING,
lastName: DataTypes.STRING
},
{
sequelize,
modelName: "User"
}
);
return User;
};
为了智能感知,我更愿意(或多或少)使用第一个示例所证明的结构:导出类,而不是函数。sequelize
我可能会在某个单独的文件中实例化,但随后require()
在我的各种模型定义中多次使用该文件。
这是一个坏主意吗?我会在不知不觉中创造一些相互竞争的联系吗?我需要担心任何副作用吗?
解决方案
推荐阅读
- wordpress - 当标题更改时,是否可以不更新 Wordpress 中的 url?
- .net - 多少垃圾收集太多了
- validation - Symfony 3.3 如何为两个嵌套的 collectionType 添加约束
- session - 会话关闭后 Tensorflow 不释放内存
- json - how to display my JSON object in good format in VBA Excel
- google-analytics - Google Analytics APIs - How can I obtain landing page path list?
- google-workspace - Gmail addon Inline installation
- javascript - Action Script 3 - ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller
- java - Java 报告 Java 版本已被弃用,即使安装了最新版本
- hyperledger-fabric - 恐慌:没有为fabric-ca库设置版本