文章目录

  • 前言
  • 一、引包
  • 二、初始化sequelize
  • 三、添加模型层
  • 四、添加服务层
  • 五、添加控制层 (增删改查)
  • 六、自定义数据校验
  • 七、统一处理返回信息
  • 八、统一处理分页格式
  • 九、在路由中引入导出接口
  • 总结

前言

1、官方文档:https://www.sequelize.com.cn/
2、sequelize-typescript文档:https://npmmirror.com/package/sequelize-typescript


一、引包

这里用到的是 mysql 如果要用其它 sql ,请查看官方文档

npm i sequelize -S
npm i sequelize-typescript -S
npm i mysql2 -S

二、初始化sequelize

1、目录: /app/db 下创建index.ts文件。
code如下:

import path from "path";
import { Sequelize } from "sequelize-typescript";
import config from "../config";
import { dbLogger } from './../logger/index'const sequelize = new Sequelize(config.db.db_name as string, config.db.db_user as string, config.db.db_password as string, {dialect: 'mysql', // 数据库类型host: config.db.db_host as string,port: config.db.db_port as unknown as number,pool: { // 连接池设置max: 5, // 最大连接数idle: 30000,acquire: 60000},logging: msg => dbLogger.info(msg), // 日志,不打印则可设置为 falsemodels: [path.join(__dirname, '..', 'model/**/*.ts'), path.join(__dirname, '..', 'model/**/*.js')],// dialectOptions: {//   charset: 'utf8mb4', // 字符集//   collate: 'utf8mb4_bin' // 排序规则// },define: {freezeTableName: true, // sequelize会给表名自动添加为复数,timestamps: true, // 开启时间戳 create_at delete_at update_atparanoid: true, // 开启假删除createdAt: 'created_at',updatedAt: 'updated_at',deletedAt: 'deleted_at',charset: 'utf8mb4', // 字符集collate: 'utf8mb4_bin' // 排序规则},timezone: '+08:00', // 改为标准时区
})export const db = async () => {try {await sequelize.authenticate();console.log('Connection has been established successfully.');} catch (error) {console.error('Unable to connect to the database:', error);}
}export default sequelize

2、在 /app/index.ts 中 添加

import { db } from './db/index'
db()

三、添加模型层

在目录:/app/model 添加 Admin.ts

import { Column, Model, Table } from "sequelize-typescript";@Table
export default class Admin extends Model {@Columnaccount!: string@Columnpassword!: string@Columnname!: string@Columnmobile!: string@Columnemail!: string@Columnis_disable!: number
}

即可映射对应的数据表

四、添加服务层

在目录:/app/service 添加 AdminService.ts

import Admin from "../model/Admin";class AdminService {getAdminById(id: number) {return Admin.findOne({where: {id: id,},})}getAdminByName(name: string) {return Admin.findOne({where: {name: name}})}addAdmin(admin: any) {return Admin.create(admin)}updateAdmin(id: number, admin: any) {return Admin.update(admin, { where: { id: id } })}deleteAdmin(id: number) {return Admin.destroy({where:{id}})}
}export default new AdminService

实现用户的增删改查

五、添加控制层 (增删改查)

在目录:/app/controller 添加 AdminController.ts

import { Rules } from "async-validator";
import { createHash } from "crypto";
import { Context } from "koa";
import paginate from "../../utils/paginate";
import response from "../../utils/response";
import validate from "../../utils/validate";
import AdminService from "../service/AdminService";class AdminController {async getAdminList(ctx: Context) {const usp = new URLSearchParams(ctx.querystring)// console.log(usp.get('page'), usp.get('pageSize'))let page = 1, pageSize = 10;// 进行类型转换的时候一定要判断一下能否转化为数字,保证程序的健壮性if (usp.get('page') !== null && !isNaN(Number(usp.get('page')))) {page = Number(usp.get('page'))}if (usp.get('pageSize') !== null && !isNaN(Number(usp.get('pageSize')))) {pageSize = Number(usp.get('pageSize'))}const { rows, count } = await AdminService.getAdminListByPage(page, pageSize)response.success(ctx, paginate(rows, page, pageSize, count))}async addAdmin(ctx: Context) {const rules: Rules = {name: [{type: 'string',required: true,message: '用户名不能为空'}],password: [{type: 'string',required: true,message: '密码不能为空'}, {type: 'string',min: 6,max: 20,message: '密码长度6-20位'}]}interface IAdmin {id: number,name: string,password: string}const { data, error } = await validate<IAdmin>(ctx, rules)if (error !== null) {return response.error(ctx, {}, error)}// 判断是否存在 该管理员const adminName = await AdminService.getAdminByName(data.name)if (adminName !== null) {return response.error(ctx, '', '管理员已存在')}data.password = createHash('md5').update(data.password).digest('hex'); // 密码加密// console.log('密码:', data.password)try {const row = await AdminService.addAdmin(data)// console.log(row)if (row.id > 0) {return response.success(ctx)}return response.error(ctx, '', '插入失败')} catch (error) {console.log(error)return response.error(ctx, '', 'sql异常')}}async updateAdmin(ctx: Context) {const id = ctx.params['id'] as numberconst admin = await AdminService.getAdminById(id)if (admin === null) {return response.error(ctx, '', '管理员不存在')}const rules: Rules = {name: [{type: 'string',required: true,message: '用户名不能为空'}]}interface IAdmin {name: string,password: string,mobile: string,email: string,}const { data, error } = await validate<IAdmin>(ctx, rules)if (error !== null) {return response.error(ctx, '', error)}if (data.password !== undefined && data.password !== '') {data.password = createHash('md5').update(data.password).digest('hex'); // 密码加密}console.log(id, data)try {const [number] = await AdminService.updateAdmin(id, data)if (number > 0) {return response.success(ctx)} else {return response.error(ctx, '', '更新失败')}} catch (error) {console.log(error)return response.error(ctx, '', 'sql异常')}}async deleteAdmin(ctx: Context) {const id = ctx.params['id'] as numberconst admin = await AdminService.getAdminById(id)if (admin === null) {return response.error(ctx, '', '管理员不存在')}// const [number] = await AdminService.deleteAdmin(id)// if (number > 0) {//   return response.success(ctx)// }const number = await AdminService.deleteAdmin(id)if (number > 0) {return response.success(ctx)}return response.error(ctx, '', '删除失败')}
}export default new AdminController

tip:
1、这里引入了async-validator 自定义数据校验。需要 npm i async-validator -S
2、封装统一处理里返回信息、分页格式。
3、nodejs 环境自带 md5

如下所示:

六、自定义数据校验

目录:/utils/validate.ts
添加如下代码:

import Schema, { Rules, Values } from "async-validator";
import { Context } from "koa";/*** @description 表单校验* @param {Context} ctx 上下文* @param {Rules} rules 校验规则* @param {boolean} flag 是否返回完整的的错误信息* @return {*}*/
async function validate<T extends Values>(ctx: Context, rules: Rules, flag: boolean = false): Promise<{ data: T, error: any | null }> {const validator = new Schema(rules)let data: any = {}switch (ctx.method) {case "GET": break;case "POST": data = getFormData(ctx); break;case "PUT": data = getFormData(ctx); break;case "DELETE": data = getFormData(ctx); break;}return await validator.validate(data).then((data) => {return {data: data as T,error: null}}).catch(err => {if (flag) {return {data: {} as T,error: err}}return {data: {} as T,error: err.errors[0].message}})
}function getFormData(ctx: Context) {// console.log(JSON.stringify(ctx.request.body))return ctx.request.body
}export default validate

七、统一处理返回信息

目录:/utils/response.ts
添加如下代码:

import { Context } from "koa";/*** @description: 统一处理返回格式* @param {Context} ctx* @param {*} data  返回的数据* @param {string} msg 提示信息* @param {number} code 状态码*/
function success(ctx: Context, data: any = [], msg: string = 'success', code: number = 0) {ctx.body = {code,msg,data}
}/*** @description: 统一处理返回格式* @param {Context} ctx* @param {*} data  扩展提示* @param {string} msg 错误提示信息* @param {number} code 状态码*/
function error(ctx: Context, data: any = [], msg: string = 'error', code: number = 1) {ctx.body = {code,msg,data}
}export default {success,error
}

八、统一处理分页格式

目录:/utils/paginate.ts
添加如下代码:

// import { Model } from "sequelize-typescript";/*** @description 统一处理分页格式* @param {*} data 列表数据* @param {number} currentPage 当前页* @param {number} pageSize 每页数量* @param {number} total 总数*/
function paginate(data: any = [], currentPage: number = 1, pageSize: number = 100, total: number = 0) {return {data,currentPage,pageSize,total,totalPage: Math.ceil(total / pageSize)}
}export default paginate

九、在路由中引入导出接口

目录:/app/router/index.ts

import koaRouter from 'koa-router'
import AdminController from '../controller/AdminController'router.post('/admin/add', AdminController.addAdmin)
router.put('/admin/:id', AdminController.updateAdmin)
router.delete('/admin/:id', AdminController.deleteAdmin)export default router

再在 /app/index.ts 中使用app.use 引入router 即可


总结

Sequelize 是一个基于 promise 的 Node.js ORM, 目前支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能。

建议多查阅官方文档。

koa+ts+mysql后台开发——(五)使用orm框架sequelize操作数据库,自定义格式校验、统一处理返回信息、分页格式相关推荐

  1. nestjs 优秀的ORM框架sequelize操作数据库

    奉上最新代码: nestjs服务demo代码=>gitee地址.github地址 nodejs的ORM–sequelize 笔者在使用koa2开发后端服务的时候用的ORM框架是sequelize ...

  2. Node.js ORM框架-sequelize

    Node.js ORM框架-sequelize 什么是ORM 什么是"持久化" 什么是持久层 ORM技术特点 什么是Sequelize Sequelize特点 使用方式 安装库 配 ...

  3. Nodejs ORM框架Sequelize

    Nodejs ORM框架Sequelize (模型,关联表,事务,循环,及常见问题) 建立连接 const Sequelize = require('sequelize'); const sequel ...

  4. Node.js ORM 框架 Sequelize 重要更新 v5 发布

    Node.js ORM 框架 Sequelize v5 已正式发布,这也是 v4 推出一年多后的主要版本. Sequelize 是一个基于 promise 的 Node.js ORM,目前支持 Pos ...

  5. php spry文本域_《PHP和MySQL Web 开发》第8章 设计Web数据库

    封面人物 刘承羽 前言 这是我学习<PHP和MySQL Web 开发>的读书笔记,一些重要的知识点我会记录下来,当然只会写我觉得重要的. 如果有幸有人看到这个学习笔记了,你要结合着书看,不 ...

  6. 【EasyExcel】后台开发如何利用EasyExcel优雅的操作Excel

    文章目录 引言 优雅的读取Excel 优雅的写入Excel 优雅的小结 点点关注,不会迷路 引言 EasyExcel是当前性能最佳的Excel导出工具,本篇少侠将带领大家一起在后台开发中优雅的使用Ea ...

  7. php sequelize,egg.js整合数据库ORM框架Sequelize

    在上篇文章中我们写了egg.js怎么连接mysql数据库, 而在一些较为复杂的应用中,我们可能会需要一个 ORM 框架来帮助我们管理数据层的代码.Java中有Mybatis.Hibernate.Spr ...

  8. Android ORM 框架:GreenDao 数据库升级

    本文作者:Speedy CSDN 专栏:blog.csdn.net/speedystone 掘金专栏:juejin.im/user/57e082- 前言 在 Android ORM 框架:GreenD ...

  9. mysql命令行 进入库_MySQL命令行操作数据库

    MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:\Program Files\MySQL\MySQL Serv ...

最新文章

  1. OpenCV-Python绑定如何工作及如何扩展新模块到Python
  2. 感知哈希算法——找出相似的图片
  3. python学会后再学c_目前python熟练 ,想再学golang 需要先学c吗?
  4. Ubuntu中Vim使用技巧
  5. java 开源缓存框架--转载
  6. NYOJ-172 小珂的图表
  7. matplotlib.pyplot---------Python强大的绘图功能软件
  8. Non-static field ‘func1‘ cannot be referenced from from a static context
  9. AC日记——3的幂的和 51nod 1013
  10. 计算机网络之传输层:1、概述(传输层功能、端口号、套接字、TCP、UDP)
  11. Tooltip工具提示控件的使用
  12. html数字自动滚动代码怎么写,你可能需要这样的大屏数字滚动效果
  13. 3d 自动生成物体_根据 2D 图片自动生成 3D 图书封面的牛逼工具
  14. day31管家婆项目训练笔记
  15. python 简单爬虫获取气象数据发送气象定时报-预报预警信息及时推送及阿里云短信群发接口...
  16. 你会用PPT中的图片占位符吗?超级好用,不错的技能
  17. 服务器4块固态硬盘做raid5,固态硬盘内RAID5技术
  18. Elastic Stack之Beats(Filebeat、Metricbeat)、Kibana、Logstash教程
  19. 戴尔硬件服务器参数,戴尔_PowerEdge R540_机架式服务器参数_服务器推荐购买 | Dell 中国大陆...
  20. PR模板 复古回忆棱镜光效梦幻内容展示PR视频模板

热门文章

  1. Android真不适合做游戏,但Google收购Ajax工具厂商,增强Android
  2. java http请求插件_Web测试调试插件RESTClient和HttpRequester
  3. java基于springboot+vue的汉服交流网站—计算机毕业设计
  4. MII,RMII,SMII,GMII,RGMII,SGMII
  5. 喜讯!青软集团再次获评「国家中小企业公共服务示范平台」
  6. realloc函_realloc 函数的用法 以及 误区
  7. (新手入门)AS3基于Starling引擎移动开发之starling简单碰撞
  8. 图解设计模式-Bridge模式
  9. TypeScript--deno前置学习
  10. 设置img的默认图片