2

可能这个疑惑只在像我这种从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;

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


asseek
9.4k 声望288 粉丝

认真到底,终有回响