首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【架构师(第一篇)】整体需求分析和架构设计
2
【架构师(第二篇)】脚手架架构设计和框架搭建
3
【架构师(第三篇)】脚手架开发之掌握Lerna操作流程
4
【架构师(第四篇)】脚手架开发之Lerna源码分析
5
【架构师(第五篇)】脚手架之import-local执行流程及简历设计
6
【架构师(第六篇)】脚手架之需求分析和架构设计
7
【架构师(第七篇)】脚手架之准备阶段编写
8
【架构师(第八篇)】脚手架之 commander 框架使用方法
9
【架构师(第九篇)】如何让 Node 环境支持 ES Module
10
【架构师(第十篇)】脚手架之注册命令及架构优化
11
【架构师(第十一篇)】脚手架之命令注册和执行过程开发
12
【架构师(第十二篇)】脚手架之命令行交互工具 inquirer.js 使用方法
13
【架构师(第十三篇)】脚手架之创建项目准备阶段开发
14
【架构师(第十四篇)】脚手架之 egg.js 和 mongodb 的使用
15
【架构师(第十五篇)】脚手架之创建项目模板开发
16
【架构师(第十六篇)】脚手架之创建项目模板的下载与更新
17
【架构师(第十七篇)】脚手架之 ejs 和 glob 的使用
18
【架构师(第十八篇)】脚手架之项目模板的安装
19
【架构师(第十九篇)】脚手架之组件库模板开发
20
【架构师(第二十篇)】脚手架之自定义模板及第一阶段总结
21
【架构师(第二十一篇)】编辑器开发之需求分析和架构设计
22
【架构师(第二十二篇)】编辑器开发之项目整体搭建
23
【架构师(第二十三篇)】编辑器开发之画布区域组件的渲染
24
【架构师(第二十四篇)】编辑器开发之添加模版到画布
25
【架构师(第二十五篇)】编辑器开发之属性编辑区域表单渲染
26
【架构师(第二十六篇)】编辑器开发之属性编辑同步渲染
27
【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门
28
【架构师(第二十八篇)】 测试工具 Vue-Test-Utils 基础语法
29
【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
30
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
31
【架构师(第三十一篇)】前端测试之 TDD 的开发方式
32
【架构师(第三十二篇)】 通用上传组件开发及测试用例
33
【架构师(第三十三篇)】 Vue 中的实例及本地图片预览
34
【架构师(第三十四篇)】 业务组件库开发之 vue3 的插件系统
35
【架构师(第三十五篇)】 业务组件库开发之使用 Rollup 进行打包
36
【架构师(第三十六篇)】 业务组件库开发之发布到 NPM
37
【架构师(第三十七篇)】 服务端开发之后端框架与数据库技术选型
38
【架构师(第三十八篇)】 服务端开发之本地安装最新版 MySQL 数据库
39
【架构师(第三十九篇)】 服务端开发之连接 MySQL 数据库
40
【架构师(第四十篇)】 服务端开发之连接 Mongodb 数据库
41
【架构师(第四十一篇)】 服务端开发之安装并连接 Redis数据库
42
【架构师(第四十二篇)】 服务端开发之常用的登录鉴权方式
43
【架构师(第四十三篇)】 服务端开发之单元测试和接口测试
44
【架构师(第四十四篇)】 服务端开发之 pm2 和 nginx 介绍
45
【架构师(第四十五篇)】 服务端开发之认识 Github actions
46
【架构师(第四十六篇)】 服务端开发之安装 Docker
47
【架构师(第四十七篇)】 服务端开发之认识 Docker
48
【架构师(第四十八篇)】 服务端开发之 Dockerfile
49
【架构师(第四十九篇)】 服务端开发之认识 Docker-compose
50
【架构师(第五十篇)】 服务端开发之自动发布到测试机
清单首页架构文章详情

【架构师(第三十九篇)】 服务端开发之连接 MySQL 数据库


连接并新建本地数据库

打开 workbench ,点击按钮连接数据库

填写数据库名称,其它默认即可

点击此处填写密码

填写安装时候设置的密码,然后点击 ok

点击测试一下连接

显示 successfully 就是成功了

关闭弹窗,点击 ok

这就是我们刚刚添加的数据库了,点击就可以查看

点击这个图标进行数据库的添加

输入数据库名称,选择编码方式,点击 apply

继续点击 apply

点击 finish

点击这里 ,就可以看到刚才新建的数据库了

这就是刚新建的数据库

右键新建的数据库,点击 Set as Default Schema 设置为此次连接的默认数据库。

使用 mysql2 测试数据库连接

安装 mysql2

代码语言:javascript
复制
npm i mysql2 sequelize -S

数据库配置文件

代码语言:javascript
复制
// src\config\envs\dev.js

module.exports = {
  // mysql 的配置
  mysqlConfig: {
    host: 'localhost',
    user: 'root',
    password: 'xiaowei123',
    port: '3306',
    database: "imooc_logo_course"
  }
}

mysql2 连接测试

代码语言:javascript
复制
// src\db\mysql2.js

const mysql = require('mysql2/promise')
const { mysqlConfig } = require('../config/envs/dev')

// mysql2 连接测试
async function testMysqlConn() {
  const connection = await mysql.createConnection(mysqlConfig)
  const [rows] = await connection.execute('select now();')
  return rows
}

// 可直接执行 node src/db/mysql2.js 进行测试
; (async () => {
  const rows = await testMysqlConn()
  console.log('🚀🚀 ~ rows', rows);
})()

module.exports = testMysqlConn

控制台执行 node src/db/mysql2.js ,打印当前时间说明数据库连接测试成功

然后我们来写一个路由进一步测试

代码语言:javascript
复制
// src\routes\index.js

const router = require('koa-router')()
const packageInfo = require('../../package.json')
const testMysqlConn = require('../db/mysql2')
const ENV = require('../utils/env')

// 测试数据库连接
router.get('/api/db-check', async (ctx) => {
  // 测试 mysql 数据库连接
  const mysqlRes = await testMysqlConn()
  ctx.body = {
    errno: 0,
    data: {
      name: 'biz editor server',
      version: packageInfo.version,
      ENV,
      mysqlConn: mysqlRes.length > 0
    }
  }
})

module.exports = router
代码语言:javascript
复制
// src\utils\env.js

// 环境变量
const ENV = process.env.NODE_ENV || ''
module.exports = {
  ENV,
  isPrd: ENV === 'production',
  isPrdDev: ENV === 'prd_env',
  idDev: ENV === 'dev',
  isTest: ENV.indexOf('test') === 0,
  isTestLocal: ENV === 'test_local',
  isTestRemote: ENV === 'test_remote'
}

执行 npm run start 把服务开启,然后访问 http://localhost:3000/api/db-check,结果如下,说明服务器连接成功了。

使用 Sequelize 测试数据库连接

配置 sequelize ,连接 mysql

代码语言:javascript
复制
// src\db\seq\seq.js

const Sequelize = require("sequelize")
const { mysqlConfig } = require('../../config/envs/dev')
const { isPrd, isTest } = require('../../utils/env')

// 连接配置
const { database, user, password, host, port } = mysqlConfig
const conf = {
  host,
  port,
  dialect: 'mysql'
}

// 测试环境不打印日志
if (isTest) {
  conf.logging = () => { } // 默认是 console.log
}

// 线上环境使用连接池
if (isPrd) {
  conf.pool = {
    max: 5, // 连接池中最大连接数量
    min: 0, // 连接池中最小连接数量
    idle: 1000, // 如果一个线程 10s 内没有被使用过的话, 就释放线程
  }
}

// 创建连接
const seq = new Sequelize(database, user, password, conf)

module.exports = seq

数据库连接测试

代码语言:javascript
复制
// src\db\seq\utils\conn-test.js

const seq = require('../seq')

// 测试连接, 直接运行 node src/db/seq/utils/conn-test.js
seq.authenticate()
  .then(() => {
    console.log('🚀🚀 ~ ok');
  })
  .catch(() => {
    console.log('🚀🚀 ~ fail',);
  })
  .finally(() => {
    console.log('🚀🚀 ~ finally',);
    process.exit()
  })

控制台执行 node src/db/seq/utils/conn-test.js ,打印 ok 说明数据库连接测试成功

模型和数据表的同步

需要在服务启动之前同步数据库,然后再启动服务

代码语言:javascript
复制
// bin\www

var syncDb = require('../src/db/seq/utils/sync-alter.js')

// 先同步 mysql 数据表
syncDb().then(() => {
  server.listen(port);
  server.on('error', onError);
  server.on('listening', onListening);
})

同步数据库的业务代码,以修改数据表的方式,不会清空数据,比较安全

代码语言:javascript
复制
// src\db\seq\utils\sync-alter.js

const path = require('path')
const simpleGit = require('simple-git')
const seq = require('../seq')
const { isDev } = require('../../../utils/env')

// 获取所有 seq model
require('require-all')({
  dirname: path.resolve('src', 'models'), // src/models 中可能会有 mongoose 的 model ,不过这里获取了也没关系
  filter: /\.js$/,
  excludeDirs: /^\.(git|svn)$/,
  recursive: true, // 递归
})

// 同步数据表
async function syncDb() {
  let needToSyncDb = true

  // 只适用于开发环境!!!
  if (isDev) {
    // 开发环境下,修改频繁,每次重启都同步数据表,消耗太大
    // 所以,开发环境下,判断是否修改了 src/models 中的内容?
    // 如果是,则同步数据表。否则,不用同步数据表。

    const git = simpleGit()
    // 获取 git status 修改的文件,modified 格式如  [ '.gitignore', 'package.json', 'src/models/README.md' ]
    const { modified, not_added: nodeAdded, created, deleted, renamed } = await git.status()
    const fileChanged = modified
      .concat(nodeAdded)
      .concat(created)
      .concat(deleted)
      .concat(renamed)
    if (fileChanged.length) {
      // 到此,说明 git status 有改动

      // 是否改动了 db 相关的文件
      const changedDbFiles = fileChanged.some(f => {
        // 改动了 src/models ,需要同步数据库
        if (f.indexOf('src/models/') === 0) return true
        // 改动了 src/db/seq ,需要同步数据库
        if (f.indexOf('src/db/seq/') === 0) return true
        // 其他情况,不同步
        return false
      })
      // 没改动 db 文件,则不需要同步
      if (!changedDbFiles) needToSyncDb = false
    }

    // 如果 git status 没有改动,则照常同步数据表,重要!!!
  }

  if (needToSyncDb) {
    await seq.sync({ alter: true })
  }
}

module.exports = syncDb

创建数据模型

封装 sequelize 类型

代码语言:javascript
复制
// src\db\seq\types.js
const Sequelize = require('sequelize')

module.exports = {
  STRING: Sequelize.STRING, // VARCHAR(255)
  TEXT: Sequelize.TEXT, // TEXT
  INTEGER: Sequelize.INTEGER,
  BOOLEAN: Sequelize.BOOLEAN,
  DATE: Sequelize.DATE,
}

测试创建一个 user module

代码语言:javascript
复制
// src\models\UserModel.js

const seq = require('../db/seq/seq')
const { STRING, DATE, BOOLEAN } = require('../db/seq/types')

const User = seq.define('user', {
  username: {
    type: STRING,
    allowNull: false,
    unique: 'username', // 不要用 unique: true, https://www.chaoswork.cn/1064.html
    comment: '用户名,唯一',
  },
  password: {
    type: STRING,
    allowNull: false,
    comment: '密码',
  },
  phoneNumber: {
    type: STRING,
    allowNull: false,
    unique: 'username',
    comment: '手机号,唯一',
  },
  nickName: {
    type: STRING,
    comment: '昵称',
  },
  gender: {
    type: STRING,
    allowNull: false,
    defaultValue: 0,
    comment: '性别(1 男性,2 女性,0 保密)',
  },
  picture: {
    type: STRING,
    comment: '头像,图片地址',
  },
  city: {
    type: STRING,
    comment: '城市',
  },
  latestLoginAt: {
    type: DATE,
    defaultValue: null,
    comment: '最后登录时间',
  },
  isFrozen: {
    type: BOOLEAN,
    defaultValue: false,
    comment: '用户是否冻结',
  },
})

module.exports = User

执行 npm run dev, 启动服务

可以看到这个时候数据库已经有 users 表了。

下一篇
举报
领券