原文地址:koa+mysql+vue+socket.io全栈开发之数据访问篇

后端搭起大体的框架后,接着涉及到的就是如何将数据持久化的问题,也就是对数据库进行 CURD 操作。

关于数据库方案, mongodbmysql 都使用过,但我选用的是 mysql,原因:

  1. 目前为止 mysqlmongodb 性能相差不大,尤其是 mysql 8.0 版本,速度非常快,查询数据是 mysql 更快,写数据方面 mongodb 则更胜一筹;
  2. mysql 建立 关联数据要更方便些,比如: 一对多,多对多的关系;
  3. mysql 作为关系型数据库,数据一致性方面更好,尤其是事务用起来更顺手;
  4. 本人对 sql 操作比较得心应手,毕竟大部分项目用得都是 mysql,而 mongodb 在正式些的项目上用的就少了,而且目前关系型数据库也在进化, postgrepmysql 都已经支持 json了。

node-mysql

node-mysql 是用 sql 语句对 mysql 进行操作的库, 并没有使用 Sequelize 这种 orm。因为我对 sql 熟悉,原生开发效率高。

连接池

连接数据库我选用 连接池的方式,这种方式能高效的利用数据库连接

//dbPool.js
const mysql = require('mysql');
const dbconfig = require('../config/db');
const log = require('../common/logger');
let pool = null; /**
* get the connection pool of database
* 获取数据库连接池
*/
exports.getPool = function () {
if (!pool) {
log.info("creating pool");
pool = mysql.createPool(dbconfig);
}
return pool;
}

数据库配置文件

emoji 格式要用 utf8mb4 格式存储,所以这里连接字符集选用 utf8mb4,当然客户端和数据结果集 一样也要设置为 utf8mb4

module.exports={
host: "localhost",
port: "3306",
user: "root",
password: "jeff",
database: "chatdb",
charset : 'utf8mb4',//utf8mb4才能保存emoji
multipleStatements: true,// 可同时查询多条语句, 但不能参数化传值
connectionLimit: 100 //连接数量
};

Dao的编写

基本的代码编写方式如下,每个方法基本都是这么一种流程,获取数据库连接,执行 sql 语句,返回结果,处理异常。

exports.queryInfo = function (params, callback){
pool.query('select ...', params, function (error, result, fields) {
if (error) {
log(error);
callback(false);
}
else callback(result)
});
}

exportDao

这造成了一大堆重复的样板代码,我们需要封装它,用 JavaScript 高阶函数特性 很容易就能实现,同时加上 Promise,调用时就能方便地用 async await 了,还有日志记录功能也加上。

const pool = require("./dbPool").getPool();
const log = require('../common/logger'); /**
* export named query function
*/
const exportDao = opts => Object.keys(opts).reduce((next, key) => {
next[key] = (...args) => new Promise((resolve, reject) => {
if (opts[key]) args.unshift(opts[key]);
log.info('====== execute sql ======')
log.info(args);
pool.query(...args, (err, result, fields) => {// fields is useless
if (err) reject(err)
else resolve(result);
});
});
return next;
}, {});

userDao文件为例,使用 exportDao 直接就能把里面的 key-value 对象输出为 以key 为方法名的dao方法,挂载到 module.exports 下。

const { exportDao } = require('./common');

//直接就exports里面的key值对应的方法
module.exports = exportDao({
sql: null,// 有些时候需要直接写sql
count: 'select count(*) as count from user where ?',
getUser: 'select * from user where ?',
insert: 'insert into user set ?',
update: 'update user set ? where id = ?',
delete: 'delete from user where ?'
}); /* 最终输出格式
module.exports = {
sql:() => {},
count:() => {},
...
}*/

transaction

还有事务 transaction 的功能需要用到,来看一下 node-mysql 官方的例子,层层回调

koa+mysql+vue+socket.io全栈开发之数据访问篇的更多相关文章

  1. koa+mysql+vue+socket.io全栈开发之web api篇

    目标是建立一个 web QQ的项目,使用的技术栈如下: 后端是基于koa2 的 web api 服务层,提供curd操作的http接口,登录验证使用的是 json web token,跨域方案使用的是 ...

  2. koa+mysql+vue+socket.io全栈开发之前端篇

    React 与 Vue 之间的对比,是前端的一大热门话题. vue 简易上手的脚手架,以及官方提供必备的基础组件,比如 vuex,vue-router,对新手真的比较友好:react 则把这些都交给社 ...

  3. Python 全栈开发【第0篇】:目录

    Python 全栈开发[第0篇]:目录   第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...

  4. 实习模块vue+java小型全栈开发(三)

    实习模块vue+java小型全栈开发(三) --dx 背景 首先,先给自己一个答案:这篇博客我定义为(三),因为之前的两个模块页面,内容都是一样的,但是被改了几次需求,就一直拖着没有上传. 今天是真正 ...

  5. Python全栈开发记录_第一篇(循环练习及杂碎的知识点)

    Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(该篇代码行数大约:300行) 知识点1:优先级:not>and 短路原则:a ...

  6. 使用vue+flask做全栈开发的全过程(实现前后端分离)

    花了几天的时间终于在本地把前后端跑通了,以一篇博客记录我这几天的心酸... 1.安装nodejs(自带npm,可能会出现版本错误,更新npm) 2.npm在国内下载时,可能会慢,所以建议要安装淘宝镜像 ...

  7. Python全栈开发记录_第九篇(面向对象(类)的学习)

    有点时间没更新博客了,今天就开始学习类了,今天主要是面向对象(类),我们知道面向对象的三大特性,那就是封装,继承和多态.内容参考该博客https://www.cnblogs.com/wupeiqi/p ...

  8. Python全栈开发记录_第二篇(文件操作及三级菜单栏增删改查)

    python3文件读写操作(本篇代码大约100行) f = open(xxx.txt, "r", encoding="utf-8") 不写“r”(只读)默认是只 ...

  9. grandstack 基于graphql&&react&& apollo&& neo4j 的全栈开发工具

    grandstack是一个基于graphql&&react&& apollo&& neo4j 的全栈开发工具. 有篇关于graphql 的5个常见问题的 ...

随机推荐

  1. Day5_递归_二分法

    递归调用: 在调用一个函数的过程中,直接或间接的调用函数本身. def func(): print('from func') 间接调用: def foo(): print('form foo') ba ...

  2. [转]用python 10min手写一个简易的实时内存监控系统

    简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...

  3. 中国的UED们

    UED网址导航:http://www.ux265.com/ 天猫UED:http://ued.tmall.com/ 一淘UED:http://ux.etao.com/ 淘宝UED:http://ued ...

  4. 重装完的win10卡“请稍等”,然后电脑不断自动重启还是卡在“请稍等”?

    http://bbs.pcbeta.com/viewthread-1625778-1-1.html 说实话我用U盘安装win10遇到过几次这种情况,不管是win10正式版还是之前的个别win10测试版 ...

  5. windows系统下输入法图标显示设置

    原先任务栏有两个搜狗输入法的标志,还有一个"中/英"的图标:甚至桌面还悬浮这一个搜狗输入法图标. 打开vscode等工具时,桌面悬浮的图标有时可能会遮挡到一些信息,十分不爽. 如今 ...

  6. 用calc()绘制手机图案解锁的九宫格样式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. java之Spring(IOC)装配Bean(手动装配、自动装配、注解装配)

    在上一篇控制反转中我们看到了依靠一个Bean文件来实现对代码的控制,可谓十分便捷,再也不用去实例化对象了,2333~~~ 1.手动装配 <bean id="todo" cla ...

  8. Spring的断言工具类Assert的基本使用

    org.springframework.util.Assert; Assert工具类,通常用于数据合法性检查. 平时做判断通常都是这样写: if(message == null || message. ...

  9. 物流的纯css实现方法

    首先我们来看看UI给出的设计图. 为什么到达是最前面,为什么物流顺序是倒叙的,这是什么用户习惯,这是我拿到设计稿的问题,但是这里不谈设计,因为审美这个东西无法评估.那么这里我就做一个顺序的来对比一下吧 ...

  10. Lintcode401 Kth Smallest Number in Sorted Matrix solution 题解

    [题目描述] Find the kth smallest number in at row and column sorted matrix. 在一个排序矩阵中找从小到大的第 k 个整数. 排序矩阵的 ...