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

更新日期: 2019-10-26 阅读: 2.7k 标签: 实例

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

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


本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!

链接: https://fly63.com/article/detial/6627

call() , apply() 与 bind() 实例详解

我们知道可以用call(), apply() 和 bind()这三个函数都是用来完成函数调用,并且设置this指向。 call()和apply()是 ECMAScript3 标准引入,而bind()函数则是在 ECMAScript 5 引入。

VUE comfirm 弹出框实例

使用VUE做demo,需要用弹出框,在网上找了一下,找了一个能用的,把使用方法总结一下,备忘

Promise 的实例方法和静态方法有哪些,如何手动实现?

Promise 是异步编程的一种解决方案,比传统的回调函数或事件更合理和更灵活。本文主要展示 Promise 提供的方法列表,以及基本的实现原理。通过本文,我们能加深 Promise 方法的理解和场景使用

Vue实例挂载的过程

我们都听过知其然知其所以然这句话:那么不知道大家是否思考过new Vue()这个过程中究竟做了些什么?过程中是如何完成数据的绑定,又是如何将数据渲染到视图的等等

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!