可能这个疑惑只在像我这种从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;
这样就直接兼容我原来的文件结构了,剩下的就是语法及逻辑的切换调整
我们知道可以用call(), apply() 和 bind()这三个函数都是用来完成函数调用,并且设置this指向。 call()和apply()是 ECMAScript3 标准引入,而bind()函数则是在 ECMAScript 5 引入。
使用VUE做demo,需要用弹出框,在网上找了一下,找了一个能用的,把使用方法总结一下,备忘
Promise 是异步编程的一种解决方案,比传统的回调函数或事件更合理和更灵活。本文主要展示 Promise 提供的方法列表,以及基本的实现原理。通过本文,我们能加深 Promise 方法的理解和场景使用
我们都听过知其然知其所以然这句话:那么不知道大家是否思考过new Vue()这个过程中究竟做了些什么?过程中是如何完成数据的绑定,又是如何将数据渲染到视图的等等
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!