开发 Node.js,首先就必须要安装 Node.js。推荐使用 ,它可以随意切换 node 版本。下载 nvm,具体可以看本人另一篇文章:nvm的作用、下载、使用、以及Mac使用时遇到commond not found:nvm如何解决。
nvm官方:https://github.com/coreybutler/nvm-windows/
下载
快速生成项目目录, 表示不需要视图。
进入项目目录,下载依赖包
运行命令,启动服务
访问 看到如下页面,即为成功
本文使用 node 专门搭建接口,所以在 中将返回格式修改为 并删掉 文件。
刷新发现页面没有变化,需要重新 ,发现正常返回了 json。
频繁执行 过于繁琐,更推荐安装 ,它可以监听改动并自动重启。
下载
修改 ,将 start 命令由 node 改为 nodemon
后面再执行 时就是通过 启动服务了,修改后自动重启服务,刷新页面即可。
在 Windows 与 macOS 下,整个安装和使用的流程都非常的不同,而且将来部署到服务器后,也会有一些默认配置不同。例如以下这个:
它是让MySQL区分数据表名是否大小写的配置。默认在 Windows、macOS 和 Linux 下全都不同。而且当数据库初始化之后,也就说成功的启动过一次后,就不能修改了。
使用 来运行 就不会有如上问题的困惑。这样在 Windows 与 macOS 上,甚至在 Linux 服务器上,它们的运行环境都是一致的。
官网下载:https://www.docker.com/get-started/
下载完成后,设置 => Docker Emgine中添加中国镜像的配置。
保存配置后,切回项目目录,在 项目根目录下 新建一个 文件。一定要在项目根目录中,放在其他地方会找不到的。然后将下面 的配置复制进去。
执行如下命令,下载并启动
如下提示标识下载启动完毕
再次切回 ,发现出现项目,以后 启动/关闭 可以通过按钮快速实现。
想要方便的操作数据库,需要下载客户端,我这里以 举例,到 AppStore 中下载 即可,Windows 可以使用 Navicat。
连接数据库
密码就是配置文件中的
继上一步连接无误后,创建新数据库。
创建表,这里以 命名,注意首字母一定要大写,不大写的话将来部署到 Linux 服务器会报错;且一定要为复数形式,即后缀s,否则 nodejs 将无法查询到这个表。
表创建完毕后,继续观察,有个 key,里面写的 ,它是主键的意思。一般,每个表都会设置一个 id,并把它设置成 表示它是唯一标识。
主键,还会搭配自增 来使用,后续追加数据时 主键 自增。
4.3.1 数字类型
4.3.2 字符串类型:
4.3.3 时间类型
4.3.4 总结 - 常用数据类型
了解了数据类型后,添加 和 。
可以看到数据已成功加入
* 表示所有的字段,如果只需要查询某些字段,指定即可。
条件查询
排序,不添加声明,默认为 升序。
手写 sql 语句过于繁琐且容易出错,可以使用一些工具简化书写逻辑,本文使用 。
先体验一下 简洁的语法:
如全量查询
条件查询, 参数就是主键 ,说白了就是通过id来查找数据。
先安装sequelize的命令行工具
然后在项目目录中,安装当前项目所依赖的 包和对数据库支持依赖的。
初始化项目
初始化完毕后,项目目录下生成了几个文件:
初始化 完毕后,项目目录生成了如下几个文件:
- config/config.json:该文件是 sequelize 需要的连接到数据库的配置文件。
- migrations:迁移,用于处理 新增表、修改字段、删除表 等操作,而不用直接在客户端中点点点直接操作数据库。
- models/index.js:模型文件,使用 增删改查时,每个文件对应数据库中的一张表。
- seeders:存放需要添加到数据表的测试数据。
6.3.1 配置 config/config.json
配置 config/config.json,Node项目就会自动的,连接到数据库上了。有三组配置,分别是:development、test 和 production。分别对应开发环境、测试环境、生产环境的配置。
本文只配置 development,其他的配置也是一样的。
- password:保持与 中一致
- database:修改数据库名,保持与 客户端中一致
- timezone:时区设置为东八区
6.3.2 migrations迁移和models模型
删除上文中通过客户端手动创建的表 Articles,通过命令新增模型
项目 迁移目录 和 模型目录下多了文件,稍作修改,将 字段设置为不可为 null。
-
up:通过 ,创建了一个叫做Articles的表。表名为复数,但是 模型为单数。
-
down:新建表的反向操作,为 也就是删除当前的表。这样当我们创建表,建完后,突然又发现有错误,也可以通过相关命令来删除当前表。
运行迁移命令
再次刷新数据库客户端,除了我们创建的 表,还自动创建了 表,这张表里记录了当前已经跑过了哪些迁移,当再次运行 时,已经运行过的迁移文件,就不会重复再次执行了。
6.3.3 种子文件
上一步运行迁移后已经创建成功了 表,下一步就是要填充一些在开发中用来测试的数据了。通过如下命令添加种子文件。
完成后,在 目录,就看到刚才命令新建的种子文件了。同样也是分为两个部分,up部分用来填充数据,down部分是反向操作,用来删除数据的。
up 和 down 中默认给了案例,仿照他的写法生成多条测试数据:
运行种子文件,生成大量数据,:命令后缀一定为该种子文件名
如我这里的种子文件为:20241126100352-article.js
就运行下面这行命令
刷新数据库,发现数据添加成功。
日常开发项目,都是采用固定的步骤:
文件并不是必须的,但对于一些需要一下子插入大量数据的情况来说,更推荐使用种子。
新增路由
app.js 中引用并use路由
启动服务,访问 ,看到正常返回。
如果想读取数据库数据,就需要使用 , 中引入模型,并通过模型读取数据库数据。
读取全部数据,读取数据是异步操作,使用 async await 等待。
刷新页面,数据已出现
通过控制台可以看到, 最终被转为 sql 语句执行。
实际场景中,数据通常是倒序,即最后添加的数据最先展示,定义查询条件即可, 时传入查询条件。
中添加获取详情接口, 通过 id 查询。
访问
通过浏览器页面查看返回不方便,更推荐使用apifox,将开发环境默认前缀设置为:http://localhost:3000,创建接口并测试。
首先需要验证表单数据,在 中添加相应配置,当前案例只对 title 参数进行校验。 为验证规则,其中:
- notNull: 没有传 title,就会提示:标题必须存在。
- notEmpty:用户传了 title 过来,但是却没有值,就会提示:标题不能为空。
- len:限制长度。
等同于
apifox 测试,故意不传 title 查看报错信息,errors 是个列表,需要遍历所有错误信息。
修改 catch 捕获错误的相关逻辑
等同于如下 sql 语句。
做这种复杂的查询,要引入 。然后修改 的查询条件,title: { [Op.like]: },这段代码等同于如下 sql 语句。
分页的 sql 语句如下, 后第一个参数为从哪个索引开始查找,第二个参数为查找多少数据。
需要注意 中,查询条件的 offset 对应 sql 语句中第一个参数,limit 字段也就是 pageSize 对应 sql 语句中第二个参数。
将 改为 ,该方法返回对象,其中 count 为数据总数,rows 为当前查询到的数据。
上面的接口代码有大量重复性代码,适当封装实现复用。思路如下:
- 如果没找到数据导致报错,通过抛出异常的方式,让catch来捕获异常,而不是直接在 try 中写 if。
- 成功和失败状态响应的封装。
- 查询、更新、删除都需要先查询当前文章,定义一个公共方法,可以直接调用这个方法。
项目根目录中新建一个 utils 目录,其中建一个 response.js,通过继承的方式,自定义一个 404 错误类,以及成功和失败状态的响应。
现在就可以通过如下方式抛出异常
成功的响应
失败的响应
封装查询文章的方法,查询、更新、删除中均可使用
优化后的整体代码
- 安装 docker 和 数据库图形化工具
- npm i -g express-generator@4:安装 express 脚手架快速搭建项目
- npm i -g sequelize-cli: 安装 sequelize 命令行工具,可以执行模型、迁移、种子相关的命令
- express --no-view clwy-api: 创建项目
- npm i:下载项目依赖
- 删除 ,根目录下创建 并配置数据库
- npm i nodemon:安装 nodemon,将 中的启动方式修改为 nodemon
- npm i sequelize mysql2:安装 sequelize 与 mysql2 依赖包,然后就可以使用 sequelize 操作 mysql
- sequelize init:初始化 sequelize,修改 中数据库相关配置
- npm start:启动服务
- 创建数据库
- sequelize model:generate --name Article --attributes title:string,content:text:创建模型, 模型名为单数形式,表名为复数形式,并指定字段与类型
- 上面一步会创建迁移文件,修改迁移文件中字段的要求,如本文将 title 字段设置为不可为null
- sequelize db:migrate:运行迁移文件,创建表
- sequelize seed:generate --name article:创建种子文件
- sequelize db:seed --seed xxx-article:运行指定种子文件,–seed后为完整文件名
- sequelize db:seed:all:运行所有种子文件
- 运行完种子文件,往表中添加测试数据
- req.params:获取路由里的参数 /admin/articles/:id
- req.query:获取 URL 地址里的查询参数 /admin/articles ?title=hello¤tPage=2&pageSize=20
- req.body:获取通过 POST、PUT 发送的数据
- findAll:查询所有记录
- findAndCountAll:查询所有记录,并统计数据总数
- findByPk:通过主键查询单条数据
- create:创建新数据
- update:更新数据
- destroy:删除数据
-
sequelize model:generate --name Article --attributes title:string,content:text:创建模型, 模型名为单数形式,表名为复数形式,并指定字段与类型
-
sequelize db:migrate:运行迁移文件,创建表
-
sequelize seed:generate --name article:创建种子文件
-
sequelize db:seed --seed xxx-article:运行指定种子文件,–seed后为完整文件名
-
sequelize db:seed:all:运行所有种子文件
如果种子文件运行后,数据不满意,可以回滚所有迁移,删除所有表和数据:
重新运行迁移,创建表
运行所有种子