前提条件
开发 Node.js,首先就必须要安装 Node.js。推荐使用 nvm
,它可以随意切换 node 版本。下载 nvm,具体可以看本人另一篇文章:nvm的作用、下载、使用、以及Mac使用时遇到commond not found:nvm如何解决。
nvm官方:https://github.com/coreybutler/nvm-windows/
1. express-generator快速生成项目目录
下载
npm i -g express-generator@4
快速生成项目目录,--no-view
表示不需要视图。
express --no-view benchu-api
进入项目目录,下载依赖包
npm i
运行命令,启动服务
npm start
访问 http://localhost:3000
看到如下页面,即为成功
2. nodemon
本文使用 node 专门搭建接口,所以在 routes/index.js
中将返回格式修改为 json
并删掉 public/index.html
文件。
刷新发现页面没有变化,需要重新 npm start
,发现正常返回了 json。
我这里下载了浏览器插件,视觉上更加美观。
频繁执行 npm start
过于繁琐,更推荐安装 nodemon
,它可以监听改动并自动重启。
下载 nodemon
npm i nodemon
修改 package.json
,将 start 命令由 node 改为 nodemon
后面再执行 npm start
时就是通过 nodemon
启动服务了,修改后自动重启服务,刷新页面即可。
3. 使用Docker运行数据库
在 Windows 与 macOS 下,整个安装和使用的流程都非常的不同,而且将来部署到服务器后,也会有一些默认配置不同。例如以下这个:
low_case_table_names=0
它是让MySQL区分数据表名是否大小写的配置。默认在 Windows、macOS 和 Linux 下全都不同。而且当数据库初始化之后,也就说成功的启动过一次后,就不能修改了。
3.1 下载 Docker 并配置中国镜像
使用 Docker
来运行 MySQL
就不会有如上问题的困惑。这样在 Windows 与 macOS 上,甚至在 Linux 服务器上,它们的运行环境都是一致的。
官网下载:https://www.docker.com/get-started/
下载完成后,设置 => Docker Emgine中添加中国镜像的配置。
"registry-mirrors": [
"https://docker.rainbond.cc"
]
保存配置后,切回项目目录,在 项目根目录下 新建一个 docker-compose.yml
文件。一定要在项目根目录中,放在其他地方会找不到的。然后将下面 MySQL
的配置复制进去。
services:
mysql:
image: mysql:8.3.0
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
environment:
- MYSQL_ROOT_PASSWORD=tianbenchu
- MYSQL_LOWER_CASE_TABLE_NAMES=0
ports:
- "3306:3306"
volumes:
- ./data/mysql:/var/lib/mysql
执行如下命令,下载并启动 MySQL
docker-compose up -d
如下提示标识下载启动完毕
再次切回 Docker
,发现出现项目,以后 启动/关闭 MySQL
可以通过按钮快速实现。
3.2 下载客户端连接数据库
想要方便的操作数据库,需要下载客户端,我这里以 MacOS
举例,到 AppStore 中下载 sequel ace
即可,Windows 可以使用 Navicat。
连接数据库
密码就是配置文件中的 MYSQL_ROOT_PASSWORD
4. 创建数据库与表
4.1 创建数据库与表
继上一步连接无误后,创建新数据库。
创建表,这里以 Articles
命名,注意首字母一定要大写,不大写的话将来部署到 Linux 服务器会报错;且一定要为复数形式,即后缀s,否则 nodejs 将无法查询到这个表。
4.2 主键
表创建完毕后,继续观察,有个 key,里面写的 PRI
,它是主键的意思。一般,每个表都会设置一个 id,并把它设置成 primary key
表示它是唯一标识。
主键,还会搭配自增 auto_increment
来使用,后续追加数据时 主键 自增。
4.3 字段类型
4.3.1 数字类型
类型 | 字节大小 | 有符号范围 (Signed) | 无符号范围 (Unsigned) |
---|---|---|---|
TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 |
MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
INT/INTEGER | 4 | -2147483648 ~2147483647 | 0 ~ 4294967295 |
BIGINT | 8 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 18446744073709551615 |
4.3.2 字符串类型:
类型 | 说明 | 使用场景 |
---|---|---|
CHAR | 固定长度,小型固定长度的数据 | 身份证号、手机号、电话、密码 |
VARCHAR | 可变长度,小型数据 | 姓名、地址、品牌、型号、用户的评论、文章的标题 |
TEXT | 可变长度,字符个数大于 4000 | 存储文章正文 |
LONGTEXT | 可变长度,超大型文本数据 | 存储超大型文本数据 |
4.3.3 时间类型
类型 | 字节大小 | 示例 |
---|---|---|
DATE | 4 | ‘2020-01-01’ |
TIME | 3 | ‘12:29:59’ |
DATETIME | 8 | ‘2020-01-01 12:29:59’ |
YEAR | 1 | ‘2017’ |
TIMESTAMP | 4 | ‘1970-01-01 00:00:01’ UTC ~ ‘2038-01-01 00:00:01’ UTC |
4.3.4 总结 - 常用数据类型
类型 | 含义 | 说明 |
---|---|---|
int | 整数 | 需要设定长度 |
decimal | 小数 | 金额常用,需要设定长度。如 decimal(10, 2) 表示共存 10 位数,其中小数占 2 位 |
char、varchar | 字符串 | 文字类的常用,需要设定长度。例如身份证号、文章的标题使用。 |
text | 文本 | 存储大文本,无需设定长度。一般会用文字很多的时候,例如文章的正文部分。 |
date、time、datetime | 日期 | 记录时间 |
4.4 新增字段
了解了数据类型后,添加 title
和 content
。
5. 基础 sql 语句
5.1 增
INSERT INTO 表名 (列1, ...) VALUES (值1, ...)
// 多行插入
INSERT INTO 表名 (列1, ...) VALUES (值1, ...),(值1, ...)...;
// 例如:
INSERT INTO `Articles` (`title`, `content`) VALUES ('行路难·其一', '长风破浪会有时,直挂云帆济沧海。');
可以看到数据已成功加入
5.2 删
DELETE FROM 表名 WHERE 条件
// 例如:
DELETE FROM `ARTICLES` WHERE `id`=5;
5.3 改
UPDATE 表名 SET 列1=值1, 列2=值2, ... WHERE 条件
// 例如:
UPDATE `Articles` SET `title`='黄鹤楼送孟浩然之广陵', `content`='故人西辞黄鹤楼,烟花三月下扬州。' WHERE `id`=2;
5.4 查
SELECT * FROM 表名;
// 例如:
SELECT * FROM `Articles`;
* 表示所有的字段,如果只需要查询某些字段,指定即可。
SELECT `id`, `title` FROM `Articles`;
条件查询
SELECT * FROM 表名 WHERE 条件;
// 想查询id大于2的文章:
SELECT * FROM `Articles` WHERE `id`>2;
排序,不添加声明,默认为 ASC
升序。
-- 查询id大于2的文章,按 id 从大到小排序,即降序
SELECT * FROM `Articles` WHERE `id`>2 ORDER BY `id` DESC;
-- 查询id大于2的文章,按 id 从小到大排列,即升序
SELECT * FROM `Articles` WHERE `id`>2 ORDER BY `id` ASC;
6. 使用 Sequelize ORM 简化书写 sql 语句
手写 sql 语句过于繁琐且容易出错,可以使用一些工具简化书写逻辑,本文使用 Sequelize ORM
。
6.1 Sequelize 常用命令
先体验一下 Sequelize
简洁的语法:
如全量查询
SELECT * FROM `Articles`;
// Sequelize 可以这么写
Article.findAll()
条件查询,findByPk
参数就是主键 primary key
,说白了就是通过id来查找数据。
SELECT * FROM `Articles` WHERE `id`=2;
// Sequelize 可以这么写
Article.findByPk(2)
6.2 安装 Sequelize
先安装sequelize的命令行工具
npm i -g sequelize-cli
然后在项目目录中,安装当前项目所依赖的 sequelize
包和对数据库支持依赖的mysql2
。
npm i sequelize mysql2
初始化项目
sequelize init
初始化完毕后,项目目录下生成了几个文件:
6.3 新增文件的作用
初始化 sequelize
完毕后,项目目录生成了如下几个文件:
- config/confi