使用sequelize.define定义Model时如何添加实例方法和类方法
你当前使用的sequelize.define架构完全支持添加实例方法和类方法,无需重构为Class继承写法,具体实现方案如下:
修改单模型文件
sequelize.define调用后会返回对应的模型类,我们可以拿到该返回值后,分别挂载类静态方法和实例原型方法,以user.model.js为例:
const { DataTypes } = require('sequelize'); module.exports = (sequelize) => { // 接收define返回的User模型类 const User = sequelize.define('user', { id: { allowNull: false, autoIncrement: true, primaryKey: true, type: DataTypes.INTEGER }, username: { allowNull: false, type: DataTypes.STRING, unique: true, validate: { is: /^\w{3,}$/ } }, }); // 类方法(静态方法):直接挂载到模型类上 User.findByUsername = async function(username) { return await this.findOne({ where: { username } }); }; // 实例方法:挂载到模型类的原型上 User.prototype.sayHello = function() { return `你好,我是${this.username}`; }; return User; };
注意:实例方法不能使用箭头函数定义,否则会丢失this指向当前实例的特性
调整统一注册逻辑(可选)
如果需要在全局统一调用模型方法,可以修改index.js的注册逻辑,将所有注册完成的模型存入对象后导出:
const { Sequelize } = require('sequelize'); // 初始化sequelize连接,替换为你自己的连接配置 const sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'mysql' }); const modelDefiners = [ require('./models/user.model'), require('./models/instrument.model'), require('./models/orchestra.model'), // 其他模型继续在此添加 ]; const models = {} // 遍历注册所有模型,并存入models对象 for (const modelDefiner of modelDefiners) { const model = modelDefiner(sequelize); models[model.name] = model; } // 此处可统一配置模型之间的关联关系 // models.user.hasMany(models.instrument) module.exports = { sequelize, models }
方法调用示例
在业务代码中引入导出的models对象后,即可直接调用对应方法:
- 调用类方法:
const targetUser = await models.user.findByUsername('zhangsan') - 调用实例方法:
const greeting = targetUser.sayHello()
内容的提问来源于stack exchange,提问作者Mike Jenkins
相关产品推荐
相关产品推荐

