这篇文章重点介绍项目封装的核心中间件,有了这些中间件,可以更好地快速开发项目
orm模块
中间件是对koa-orm进行再一次的封装,使其能够使用单例模式
lib目录下是koa-orm需要使用到的一些库文件,入口文件为index.js
sequelize 模块的使用可以到官网查看,这里就不具体展开说明
index.js文件介绍
将orm相关对象的初始化放在文件头,在js初次加载的时候一同初始化,使其只初始化一次,形成单例模式
//指定数据库配置文件位置
let dbConfig = require('../../../config/db.json')
let _path = path.resolve('./')
//设置schema文件目录
dbConfig.modelPath = path.join(_path, '/app/schema')
//传入数据库配置,初始化orm对象
const orm = require('koa-orm')(dbConfig);
//获取db数据库对象
const database = orm.database();
构建数据库连接类,构造函数传入文件头初始化的db数据库对象,并向外暴露获取db对象方法connect
class DbConnect {
constructor(database){
this.db = database
}
getDatabase() {
return this.db
}
}
let connect = new DbConnect(database);
module.exports = {
connect: connect.getDatabase()
}
orm中间件的使用
在models目录下有一个BaseModel文件,它是所有dao层文件都需要继承的一个base类,集成后就可以使用数据库db对象了,并且base类也抽离了一些公共的方法
在文件头引入orm中间的数据库db对象
//引入orm中间的数据库db对象
const ORM = require('../middleware/orm').connect;
通过构造函数的方式,设置当前的orm对象
constructor(opts){
this.opts = opts || {};
this.orm = ORM;
this.model = this.opts.model;
this.attrs = this.opts.attrs;
this.list_attrs = this.opts.list_attrs
this.logger = myLog4js;
}
通过sequelize的一些api就可以实现增删改查的方法
/**
* 根据表的pk字段获取该记录
*
* @param id
* @returns {Promise<any>}
*/
async get(id) {
return await this.orm[this.model].findByPk(id);
}
其中"this.orm[this.model]"为获取子类的具体model类,以demo项目的”JqmUserModel“为例
const BaseModel = require('./BaseModel')
const opts = {}
opts.model = 'JqmUser'
//表全字段
opts.attrs = ['id', 'user_name', 'user_pw', 'cover', 'nick_name', 'sex', 'ip', 'country', 'type', 'level', 'state', 'create_time', 'update_time']
//查询多条记录时,返回的字段
opts.list_attrs = ['id', 'cover', 'nick_name', 'sex', 'type', 'level']
class JqmUserModel extends BaseModel{
constructor (opts) {
super(opts)
}
}
let model = new JqmUserModel(opts);
module.exports = model
JqmUserModel继承了BaseModel,其中文件头"opts.model = ‘JqmUser’"就是设置此方法使用的模型(对应着schema定义的名称JqmUser)
const Sequelize = require('sequelize');
module.exports = function(sequelize, DataTypes) {
let JqmUser = sequelize.define("JqmUser",
{
user_name: Sequelize.STRING,
user_pw: Sequelize.STRING,
cover: Sequelize.STRING,
以后有新的数据表,dao层只需要继承BaseModel就可以获取到对应的数据库对象了
我这边自己写了一个model和schema的自动生成器项目,大家有需要可以访问我的 github项目
具体可以看项目的帮助文档,也很简单,只要输入一个数据表名就可以使用了
BaseModel 的创建方法create默认会自动加入’create_time‘、‘update_time’和’state’,三个字段,所以对应的数据表内要包括这三个字段。如果不需要,可进行删除