当前位置: 首页 > 后端技术 > Node.js

在sequelize中定义实例方法方法和静态方法statics

时间:2023-04-03 21:09:30 Node.js

可能这个疑惑只出现在我这种想从mongoose转sequelize的人身上。首先官方文档推荐的方法:const{Sequelize,Model}=require('sequelize');constsequelize=require('../../base/db');classUserextendsModel{//静态方法相当mongooseschema上定义的方法。staticstaticmethod(){return'staticsfunction';};//实例方法等同于在mongooseschema.methodsmethod()上定义的方法{return'methodsfunction';}}用户。init({id:{type:Sequelize.INTEGER(11),primaryKey:true,autoIncrement:true,},name:{type:Sequelize.STRING,},},{sequelize,tableName:'users'});最近有个项目要升级,数据库需要从mongodb迁移到mysql,所以要学习使用sequelize,准备替换原来的mongose。之前在node中用过mongoose,习惯用schema.methods定义实例方法,用schema.statics定义静态方法。因为项目模型较多,为了方便维护,也将不同的方法分文件维护mongoose项目模型index.js写法constmongoose=require('mongoose');constschema=require('./schema');constmethods=require('./methods');conststatics=require('./statics');constUser=newmongoose.Schema(schema);for(constattrinmethods){User.methods[attr]=methods[attr];}for(constattrinstatics){User.statics[attr]=statics[attr];}module.exports=mongoose.model('users',User);sequelize在类上定义了方法,我想和原来一样维护单个文件怎么办?思前想后,有两种选择。1.为每个文件编写类并逐级继承//statics.jsclassUserStaticsextendsModel{//静态方法staticmethod(){};}//methods.jsclassUserMethodsextendsUserStatics{//实例方法method(){};}//index.jsclassUserextendsUserMethods{}如果我采用这种方案,升级我原来的项目会非常困难,这意味着每个文件都得重写。2.直接给类(函数)添加方法,再想一想。事实上,ES6类只是构造函数的语法糖classUser{staticmethod(){return'staticsfunction';}method(){return'方法函数';}}等于functionUser(){}User.method=function(){return'staticsfunction';};User.prototype.method=function(){return'methodsfunction';};想了想重写简单,我就赶紧把index.js写出来sequelize项目模型index.js写法const{Model}=require('sequelize');constsequelize=require('../../base/db');constschema=require('./schema');constmethods=require('./methods');conststatics=require('./statics');classUserextendsModel{}for(constattrinmethods){User.prototype[attr]=methods[attr];}for(constattrinstatics){User[attr]=statics[attr];}User.init(schema,{sequelize,tableName:'users'});module.出口=用户;这样就直接兼容我原来的文件结构了,剩下的就是语法和逻辑的切换调整