使用 sequelize.define 时如何向模型添加实例和 class 级方法

How to add instance and class level methods to a Model when using sequelize.define

我是第一次使用 Sequelize,我已经按照 official Sequelize github.

中所示的类似方式构建了我的应用程序

每个模型都在其自己的文件中设置(例如):

user.mode.js

    const { DataTypes } = require('sequelize');
    
    // We export a function that defines the model.
    // This function will automatically receive as parameter the Sequelize connection object.
    module.exports = (sequelize) => {
        sequelize.define('user', {
            // The following specification of the 'id' attribute could be omitted
            // since it is the default.
            id: {
                allowNull: false,
                autoIncrement: true,
                primaryKey: true,
                type: DataTypes.INTEGER
            },
            username: {
                allowNull: false,
                type: DataTypes.STRING,
                unique: true,
                validate: {
                    // We require usernames to have length of at least 3, and
                    // only use letters, numbers and underscores.
                    is: /^\w{3,}$/
                }
            },
        });
    };

然后每个模型都被拉入应用程序:

index.js

    const modelDefiners = [
        require('./models/user.model'),
        require('./models/instrument.model'),
        require('./models/orchestra.model'),
        // Add more models here...
        // require('./models/item'),
    ];
    
    // We define all models according to their files.
    for (const modelDefiner of modelDefiners) {
        modelDefiner(sequelize);
    }

我想为每个模型添加特定功能,以便这些功能在我的应用程序的其他地方可用,但我不确定如何最好地做到这一点。在 Sequelize 文档中有一个 example,但是它只展示了如何扩展模型 class。我可以尝试重构以匹配它,但想看看是否有一种方法可以按照 Sequelize 提供的示例设置来做到这一点。

您可以将 sequelize.define 的 return 值保存到局部变量中,并用它来定义一些静态方法,甚至 return 这个已注册的模型用它来调用所有模型包括您自己的方法。
参见

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    id: { type: DataTypes.BIGINT, allowNull: false, autoIncrement: true, unique: true, primaryKey: true },
    first_name: DataTypes.STRING,
    last_name: DataTypes.STRING
  }, {});
  User.associate = function(models) {
    User.belongsTo(models.Role, { foreignKey: 'role_id' });
  };
  return User;
};