上一篇介绍了如何创建项目、路由的访问以及如何创建模块,这篇来讲讲数据库的连接与使用。

一、数据库准备

首先要确保你有数据库可以连接,如果没有,可以在 MySQL 官网下载一个,本地跑起来。安装教程这里就不叙述了,“百度一下,你就知道”。

推荐使用 Navicat Premium 可视化工具来管理数据库。

用 Navicat 连接上数据库后,新建一个库:

nest应用部署 nest如何安装_typescript

 

nest应用部署 nest如何安装_mysql_02

我们先随便插入2条数据,方便后面的查询:

nest应用部署 nest如何安装_typescript_03

 二、项目的数据库配置

先在项目根目录创建一个文件夹 config(与 src 同级),专门放置各种配置。

然后新建一个文件 db.ts:

nest应用部署 nest如何安装_mysql_04

 

安装mysql2依赖包:

npm i mysql2

原生sql测试链接mysql,创建一个utils/initDB.ts,在main.ts中引入

nest应用部署 nest如何安装_nest应用部署_05

运行打印出了数据就代表成功了 

nest应用部署 nest如何安装_数据库_06

上面是原生链接测试,但是我们可以使用第三方库,方便写增、删、改、查 ;

 市面上有很多连接数据库的工具,这里使用的是 Sequelize,先安装依赖包:

npm i sequelize sequelize-typescript -S

 然后在 src 目录下创建文件夹 database,然后再创建 sequelize.ts

// src/database/sequelize.ts
import { Sequelize } from 'sequelize-typescript';
import db from '../../config/db';
const {mysqlData} = db
const sequelize = new Sequelize(mysqlData.database, mysqlData.user, mysqlData.password || null, {
  // 自定义主机; 默认值: localhost
  host: mysqlData.host, // 数据库地址
  // 自定义端口; 默认值: 3306
  port: mysqlData.port,
  dialect: 'mysql',
  pool: {
    max: mysqlData.connectionLimit, // 连接池中最大连接数量
    min: 0, // 连接池中最小连接数量
    acquire: 30000,
    idle: 10000, // 如果一个线程 10 秒钟内没有被使用过的话,那么就释放线程
  },
  timezone: '+08:00', // 东八时区
});

// 测试数据库链接
sequelize
  .authenticate()
  .then(() => {
    console.log('数据库连接成功');
  })
  .catch((err: any) => {
    // 数据库连接失败时打印输出
    console.error(err);
    throw err;
  });

export default sequelize;

三、数据库连接测试

好了,接下来我们来测试一下数据库的连接情况。

我们重写 user.service.ts 的逻辑:

nest应用部署 nest如何安装_mysql_07

保存文件,就会看到控制台刷新了(前提是使用 npm run start:dev 启动的),并打印下列语句: 

nest应用部署 nest如何安装_nest应用部署_08

这说明之前的配置生效了,我们试着用之前的参数请求一下接口:

nest应用部署 nest如何安装_数据库_09

 我们改成正确的已存在的手机号再试试:

nest应用部署 nest如何安装_数据库_10

然后观察一下控制台,我们的查询语句已经打印出来了,通过 logging: true,可以在调试 Bug 的时候,更清晰的查找 SQL 语句的错误,不过建议测试稳定后,上线前关闭,不然记录的日志会很繁杂:

nest应用部署 nest如何安装_typescript_11

 

再对照一下数据库里的表,发现查出来的数据和数据库里的一致,至此,MySQL 连接测试完成,以后就可以愉快的在 Service 里面搬砖了。 

总结

这篇介绍了 MySQL 的数据准备、Sequelize 的配置、Nest 怎么通过 Sequelize 连接上 MySQL,以及用一条简单的查询语句去验证连接情况。

在这里,强烈建议使用写原生 SQL 语句去操作数据库

虽然 Sequelize 提供了很多便捷的方法,具体可去 Sequelize v5 官方文档 浏览学习。但笔者通过观察 logging 打印出来的语句发现,其实多了很多无谓的操作,在高并发的情况下,太影响性能了。

而且如果不使用原生查询,那么就要建立对象映射到数据库表,然后每次工具更新,还要花时间成本去学习,如果数据库改了字段,那么映射关系就会出错,然后项目就会疯狂报错以致宕机

而使用原生 SQL,只需要学一种语言就够了,换个工具,也能用,而且就算改了字段,也只会在请求接口的时候报错,到时候再针对那个语句修改就好了,而且现在查找替换功能这么强大,批量修改也不是难事。

最重要的是,如果你是从前端转后端,或者根本就是0基础到后端,还是建议先把 SQL 的基础打牢,不然连 JOINLEFT JOIN 和 RIGHT JOIN 的区别都分不清