美文网首页
在sequelize里面定义实例方法methods和静态方法st

在sequelize里面定义实例方法methods和静态方法st

作者: asseek | 来源:发表于2019-11-25 13:45 被阅读0次

    可能这个疑惑只在像我这种从mongoose要切换到sequelize的人身上出现。
    先上官方文档推荐的方法:

    const {Sequelize, Model} = require('sequelize');
    const sequelize = require('../../base/db');
    
    class User extends Model {
    
      // 静态方法 相当于mongoose schema.statics上定义的方法
      static method() {
         return 'statics function';
      };
    
      // 实例方法 相当于mongoose schema.methods上定义的方法
      method() {
        return 'methods function';
      }
    }
    
    User.init({
      id: {
        type: Sequelize.INTEGER(11),
        primaryKey: true,
        autoIncrement: true,
      },
      name: {
        type: Sequelize.STRING,
      },
    }, {sequelize, tableName: 'users'});
    

    最近有个项目要升级,并且数据库要从mongodb迁移到mysql,于是要学习使用sequelize,准备替换原来的mongose
    之前在node都是用mongose,习惯了用schema.methods定义实例方法,用schema.statics来定义静态方法。
    因为项目模型比较多,为了更容易维护,还把不同的方法分文件独立维护

    mongoose项目 model 目录
    mongoose项目模型index.js写法
    const mongoose = require('mongoose');
    
    const schema = require('./schema');
    const methods = require('./methods');
    const statics = require('./statics');
    
    const User = new mongoose.Schema(schema);
    
    for (const attr in methods) {
      User.methods[attr] = methods[attr];
    }
    
    for (const attr in statics) {
      User.statics[attr] = statics[attr];
    }
    
    module.exports = mongoose.model('users', User);
    

    sequelize把方法定义在class上面,我如果想像原来那样单文件维护呢?
    考虑了一下,有两个方案。
    1、每个文件写class逐级继承

    // statics.js
    class UserStatics extends Model {
      // 静态方法
      static method() {
      };
    }
    
    // methods.js
    class UserMethods extends UserStatics {
      // 实例方法
      method() {
      };
    }
    
    // index.js
    class User extends UserMethods {
    
    }
    

    如果采用这个方案我原项目要升级难度就大了,等于每个文件全部要重写。
    2、直接为class(函数)添加方法
    又想了下,其实ES6 class只是构造函数的语法糖而已

    class User {
      static method() {
        return 'statics function';
      }
      method() {
        return 'methods function';
      }
    }
    

    等于

    function User() {
    }
    
    User.method = function () {
      return 'statics function';
    };
    
    User.prototype.method = function () {
      return 'methods function';
    };
    

    想通这点改写起来就简单了,我很快把index.js写出来
    sequelize项目模型index.js写法

    const {Model} = require('sequelize');
    const sequelize = require('../../base/db');
    
    const schema = require('./schema');
    const methods = require('./methods');
    const statics = require('./statics');
    
    class User extends Model {
    }
    
    for (const attr in methods) {
      User.prototype[attr] = methods[attr];
    }
    
    for (const attr in statics) {
      User[attr] = statics[attr];
    }
    
    User.init(schema, {sequelize, tableName: 'users'});
    
    module.exports = User;
    

    这样就直接兼容我原来的文件结构了,剩下的就是语法及逻辑的切换调整

    相关文章

      网友评论

          本文标题:在sequelize里面定义实例方法methods和静态方法st

          本文链接:https://www.haomeiwen.com/subject/tjudwctx.html