从Express开始学习node.js(五)接入数据库

862 阅读10分钟

从Express开始学习node.js(五)接入数据库

引言

在本专栏的上一篇文章从Express开始学习node.js(四)模板引擎中,我们了解了什么是模板引擎、常用的模板引擎有哪些、以及如何使用模板引擎。最后,笔者聊了些自己对于模板引擎,以及前后端分离的想法

接下来,我们将要学习接入数据库这一重要概念,继续充实我们的技术积累。

本篇文章作为node.js系列的第三章节,主要内容有:

  • 什么是数据库

  • 常用的数据库

  • 搭建MySQL数据库环境

  • 在MySQL数据库中建一个简单的表

  • 在Express中接入MySQL数据库

注:本章节所有的内容,都需要node.js环境,请确保自己已安装node环境

一、数据库简介

数据库是一个按数据结构存储和管理数据计算机软件系统,主要提供CURD功能,即对于数据进行增删改查。

软件使用的过程,数据库至关重要。万物皆可为数据,我们的用户信息、购物数据、访问数据等,都是通过管理数据库来实现长期存储的,我们修改密码、添加订单、收藏文章等操作,本质都是在操作数据库。

本章节大部分篇幅是用于介绍MySQL数据库的安装与使用的,如果小伙伴已经了解过MySQL数据库,那么可以跳到五、在Express中接入MySQL数据库查看。

二、常用的数据库

数据库可以分为关系型数据库和非关系型数据库两种类型。关系型数据库是指采用了关系模型来组织数据的数据库,如 MySQL、Oracle 等。非关系型数据库则是指不采用关系模型来组织数据的数据库,如 MongoDB、Redis 等。

不同数据库具有不同的特征,但是基本的思想是相通的,具体使用哪一种数据库,需要根据部门规划及业务场景来做决定。

笔者所在公司使用的是MySQL数据库,所以在本文中将主要介绍MySQL数据库的使用,以及在Express中的接入。

三、搭建MySQL数据库环境

不同操作系统下,MySQL数据库环境的搭建方式不同。小伙伴们请根据自己使用的操作系统来搭建.

由于笔者使用的是Windows操作系统,所以这里以Windows为例,来搭建一个本地的MySQL数据库环境。

1、下载安装MySQL

进入到MySQL官网下载地址,选择下图中的版本,点击Download进入到下载页面:

mysql-download.png

在下载页面,点击下图中的 No thanks, just start my download.  就可立即下载:

mysql-download-1.png

2、解压到指定目录

下载完成后,将MySQL解压到指定目录。该目录将存放MySQL的数据,请选择一个合理的位置。

笔者将MySQL解压到了F:\MySQL\mysql-8.0.33-winx64目录下。

3、编写MySQL配置文件

首先,我们进入到指定目录中:

cd F:\MySQL\mysql-8.0.33-winx64\mysql-8.0.33-winx64

这里我们需要根据实际情况,找到与bin目录同级的位置

然后,我们在该目录下创建my.ini配置文件,编辑my.ini配置以下基本信息:

[client]
# 设置mysql客户端默认字符集
default-character-set=utf8

[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=F:\MySQL\mysql-8.0.33-winx64\mysql-8.0.33-winx64
# 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错
# datadir=C:\\web\\sqldata
# 允许最大连接数
max_connections=20
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

4、启动MySQL数据库

以管理员身份打开 cmd 命令行工具:

mag.png

切换目录到\bin

F:
cd F:\MySQL\mysql-8.0.33-winx64\mysql-8.0.33-winx64\bin

初始化数据库:

mysqld --initialize --console

执行完成后,会输出 root 用户的初始默认密码:

2023-06-07T07:14:31.474876Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: =lmrJhxdw9je

我们需要把这个密码先记录下来,记得一定要记录。

然后我们安装一下mysqld,:

mysqld install

就可以启动数据库了:

net start mysql

看到以下日志输出,就证明数据库已经启动成功了:

sql_start.png

这里有2个需要注意的地方,笔者在这一步踩过坑:

  • 当我们执行mysqld命令时,会提示'mysql'不是内部或外部命令,也不是可运行的程序或其处理文件。这个问题是因为没有配置环境变量,配置环境变量之后就可以正常使用mysql命令了。

  • Windows下的脚本命令与Linux下不同,如果不是系统盘(一般为C盘),则需要手动切换到指定盘,即我们在命令行中输入的F:

5、登录MySQL数据库

当 MySQL 服务已经运行时, 我们就可以通过 MySQL 自带的客户端工具登录到 MySQL 数据库中了。

1. 初次登录

MySQL的登录命令为:

mysql -h 主机名 -u 用户名 -p
  • -h : 指定客户端所要登录的 MySQL 主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略;
  • -u : 登录的用户名;
  • -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。

我们是登录本机(即:localhost)、用户为root、密码是初始化时记录下的=lmrJhxdw9je,所以我们用如下命令来登录前面启动的数据库:

mysql -u root -p=lmrJhxdw9je

当看到控制台打印Welcome to the MySQL monitor.时,则表示登陆成功:

mysql-login.png

我们现在可以在mysql>命令行中操作我们的MySQL数据库了。

注意:-p后面不能有空格,要直接跟密码!

2. 修改密码

我们在启动MySQL数据库时,初始化生成的密码不便于记忆。所以我们在初次登录后,首先将root的密码做一个修改,这里因为我们用的是MySQL 8.x版本,所以我们用下述命令来修改密码:

alter user'root'@'localhost' identified by 'root1234';

成功后会打印:Query OK, 0 rows affected (0.07 sec)

change_pass.png

注意:不同版本之间修改密码的命令是不同的!如果出现错误,请查找对应版本的修改命令。

在修改密码之后,我们要刷新MySQL的系统权限相关表:

flush privileges;

同样,成功后会打印:Query OK, 0 rows affected (0.07 sec)

ref.png

然后我们退出:

quit;

quit.png

用新密码root1234登录进来:

mysql -u root -proot1234

login2.png

6、安装MySQL client(可选)

我们想要管理我们的数据库,离不开使用client,常用的MySQL client有:

  • MySQL Client

  • Navicat

  • MySQL Workbench

MySQL Client是MySQL官方提供的命令行工具,可以在终端中直接操作 MySQL 数据库,安装MySQL Server时会同时安装MySQL Client。

Navicat不仅支持MySQL,还支持Oracle、SQL Server 等多种数据库,其用户界面简洁明了、易于使用,笔者身边的后端朋友大都使用Navicat,是最受欢迎、使用体验最好的client。唯一的缺点是要付费,或者需要破解才能使用。

MySQL Workbench是MySQL官方提供的数据库管理工具,用户界面比Navicat要复杂一些,但功能完善,胜在免费

这三种client都能够满足我们的基础使用,大家根据自己的需要选择即可。

基于简单学习使用的目的,在本文中我们选择使用MySQL Client命令行工具

四、使用MySQL

到这一步,我们已经完成了MySQL数据库的环境搭建,接下来我们就来学习一下如何使用MySQL数据库。

本文中不会对操作数据库的每一步进行介绍,如果对于数据库不太了解的小伙伴,可以参考廖雪峰的SQL教程或者菜鸟教程的MySQL教程学习。

1、创建数据库

我们可以来查看初始化创建时,MySQL中有哪些数据库:

show databases;

databases.png

上述的4个库:information_schemamysqlperformance_schemasys是系统库,不要去改动它们。

我们来创建一个自己的数据库the_outcast

CREATE DATABASE the_outcast;

create.png

我们再来查看一下数据库列表,发现我们刚才创建的数据库the_outcast已经存在了:

show2.png

对一个数据库进行操作时,要首先将其切换为当前数据库,我们切换到the_outcast数据库:

use the_outcast

use.png

2、建表

我们已经创建了一个the_outcast数据库,由于我们还没有建表,所以得到了Empty set的结果:

show tables;

show.png

创建MySQL数据表的SQL通用语法是:

CREATE TABLE table_name (column_name column_type);

我们来创建一个users表,用来存储用户的信息,这个表中的每一行应该包括3列:

  • 用户id
  • 用户名
  • 密码

user.png

3、插入数据

我们已经创建了一张users表,由于我们还没有插入数据,所以得到了:

select * from user;

select.png

向MySQL数据表插入数据通用的SQL语法为:

INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );

我们先用命令行来创建一个管理员admin

insert into user (user_name, user_password) values ('admin','admin1234');

insert.png

我们再来查看一下users表中的数据:

users.png

五、在Express中接入MySQL数据库

通过前面的学习,我们已经获得了一个MySQL数据库环境,并且有了基本的结构:the_outcast数据库 -> user表 -> admin用户。现在,我们可以将视线从MySQL中离开了,剩下的部分将在Express中完成。

出于简单学习、了解在Express中如何接入MySQL数据库即可的目的,我们仅在Express中完成一个功能:获取所有用户。

  1. 安装mysql依赖

    npm install mysql

  2. 在根目录下创建一个db文件夹

    mkdir db

  3. /db目录下创建一个index.js文件,来编辑操作mysql的配置文件

// db/indes.js
const mysql = require('mysql')

// 注意:这里要根据自己数据库中的配置来填写!
const connection = mysql.createConnection({
  host: 'localhost',
  port: 3306,
  user: 'root',
  password: 'root1234',
  database: 'the_outcast'
})
connection.connect()

module.exports = connection;
  1. /index.js中,引入/db/index.js中导出的connection:
// index.js
...
const db = require("./db/index");
...
  1. 我们新增对于/users目录的GET请求,让服务器查询the_outcast数据库中user表的所有成员,并返回给客户端:
// index.js
app.get('/users', (req, res) => {
    db.query('select * from user', (err, users) => {
        if (err) throw err
        res.json(users);
    })
})

我们用postman请求一下,可以发现我们已经拿到了之前创建的admin用户的信息:

admin.png

六、关闭数据库

当我们确认数据库暂时不会使用,或者我们需要停机维护时,记得关闭数据库,否则数据库会一直在后台运行:

net stop mysql

stop.png

需要注意的是,当数据库关闭时,我们在Express中的服务也会受到影响,所以关闭数据库需慎重!

总结

在这一节,我们学习了如何搭建一个MySQL环境、如何使用MySQL来建库建表、如何在Express中接入MySQL数据库,并且完成了users这个简单的DEMO。

至此,我们已经实现了一个Express项目的完整流程,包括了路由、中间件、处理静态资源、接入数据库等内容。各位小伙伴只需要利用已经学习过的内容,发挥自己的创意,就可以完成一个属于自己的项目了。

接下来笔者会休息一段时间,先思考一下后续的学习思路,再继续更新本专栏的文章,山高路远,后会有期!

我是何以庆余年,如果文章对你起到了帮助,希望可以点个赞,谢谢!

如有问题,欢迎在留言区一起讨论。