【koajs项目实践】三、项目中间件介绍-orm

这篇文章重点介绍项目封装的核心中间件,有了这些中间件,可以更好地快速开发项目

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’,三个字段,所以对应的数据表内要包括这三个字段。如果不需要,可进行删除

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

reui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值