首页 > 解决方案 > 在项目中多次实例化 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 促进了以下项目结构:

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

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

以下是User.jsSequelize 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()在我的各种模型定义中多次使用该文件。

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

标签: node.jssequelize.jssequelize-cli

解决方案


推荐阅读