在项目中多次实例化 Sequelize 连接:这是一个坏主意吗?

问题描述

我对这个问题的目标是在我的 node.js(不是打字稿)项目中以安全和可持续的方式实现 VS Code 智能感知和 Sequelize 模型定义。

可以构建Sequelize模型

  • 通过钩子,或
  • 通过扩展模型类。

用钩子创建的模型不会被智能感知理解,所以我在下面关注后者。


Sequelize 模型构造函数需要配置的 Sequelize 连接实例。至少有两种方法可以适应这一点。

A - 在每个模型旁边实例化 sequelize(即:多次)

一个documented example of model definition

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 促进了以下项目结构:

  1. 每个模型定义文件都导出一个构建 Model 类的函数。该函数接受 sequelize 实例作为参数。
  2. models/index.js 文件实例化 sequelize -- 项目中唯一发生这种情况的地方。然后调用每个模型定义函数,并将此 sequelize 实例传递给该函数
  3. 生成的模型全部由 models/index.js 导出。

似乎智能感知不理解这一点,并且无法从这些由函数创建的导出中跟踪类方法

以下是 Sequelize CLI 将为与上述示例完全相同的模型创建的 User.js 文件

"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,但随后会在我的各种模型定义中多次实例化该文件

这是个坏主意吗?我会在不知不觉中制造一些相互竞争的连接的杂音吗?我需要担心任何副作用吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)