本项目是基于 Express、Node.js 和 Sequelize 的学习项目,用于掌握全栈开发技术。
以下是在该项目中参考的学习地址:
.
├── config
│ └── config.json
├── migrations
│ └── 20251201154843-create-article.js
├── models
│ ├── article.js
│ └── index.js
├── public
│ └── stylesheets
│ └── style.css
├── routes
│ ├── admin
│ │ └── article.js
│ ├── index.js
│ └── users.js
├── seeders
│ └── 20251201161825-article.js
├── utils
│ └── response.js
├── README.md
├── app.js
├── package-lock.json
└── package.json
- Node.js: JavaScript 运行时环境
- Express: Web 应用框架
- Sequelize: ORM (对象关系映射)工具
项目包含 .gitignore 文件,用于忽略不需要进行版本控制的文件和目录,如 node_modules/。
提示: 这个咒语,是用来新建模型的,将来大家还会经常用到它的。
sequelize model:generate --name Article --attributes title:string,content:text
根据学习资料逐步完善项目功能,包括但不限于:
- 数据库模型设计与实现
- RESTful API 开发
- 前端页面与后端接口对接
- 用户认证与权限管理
config: 是配置的意思,这里放的也就是sequelize所需要的连接数据库的配置文件。
migrations: 是迁移的意思,如果你需要对数据库做新增表、修改字段、删除表等等操作,就需要在这里添加迁移文件了。而不是像以前那样,使用客户端软件来直接操作数据库。
models: 这里面存放的是模型文件,当我们使用sequelize来执行增删改查时,就需要用这里的模型文件了。每个模型都对应数据库中的一张表。
seeders: 是存放的种子文件。一般会将一些需要添加到数据表的测试数据存在这里。只需要运行一个命令,数据表中就会自动填充进一些用来测试内容的了。
实现查询操作,我们需要使用的传递参数的方式是通过 /articles?title=标题 10 这种形式来实现的。这和我们之前学的 /articles/1 这种形式非常像。它们都是 GET 请求,但是这里多了个 ?,而且是等于的这种格式。这种格式的传值方式,获取数据又不一样了,要用 req.query,这是实现通过关键词搜索东西,非常标准的做法。
那解决方法很简单,就是不要用 req.body 了。我们可以将 title 和 content 从 req.body 取出来,如果用户提交了其他的东西,我们一概不管就可以了。通常这种方式,可以叫做白名单过滤,在有的地方也会叫做强参数过滤,不过不管怎么叫,都是一个道理。
大家再看更新文章里,也有 req.body,也是一次性接受了所有的参数。所以这里也需要使用白名单过滤一下数据。
但如果把这段代码再写一遍,又太重复了。所以我们干脆在最底部,定义一个公共的方法,专门供创建文章和更新文章使用。
🔒 安全原则
永远不要相信用户提交的任何数据
用户提交的数据,一定要做过滤,只保留你需要的内容。
用户提交的数据,一定要做验证
验证最好放在模型里
可以使用 Joi 中间件制作验证规则,再用某一个(忘了)中间件自动执行验证规则,在路由的时候。
开发 Node.js 项目,首先,要全局安装两个包。
| 命令 | 说明 |
|---|---|
npm i -g express-generator@4 |
安装 express 脚手架 |
npm i -g sequelize-cli |
安装 sequelize 命令行工具 |
💡 说明
先安装了 express 脚手架,这样就可以用命令创建项目。
接着安装了 sequelize-cli,这样才能执行模型、迁移、种子相关的命令。
因为它们都是全局安装的,所以在电脑上,只需要运行一次,就不用重复再次安装了。
当这些都装好了,就要来创建项目了。初始化一个项目的相关步骤有以下这些:
| 命令 | 说明 |
|---|---|
express --no-view clwy-api |
创建项目 |
cd clwy-api |
进入项目里 |
npm i |
安装依赖包 |
npm i nodemon |
安装 nodemon |
npm i sequelize mysql2 |
安装 sequelize 与 mysql2 依赖包 |
sequelize init |
初始化 sequelize |
npm start |
启动服务 |
📝 详细说明
- 创建项目,并指定不需要视图文件。还要记得,要删除 public/index.html 文件。
- 接着要用 cd 命令,进入项目里。
npm i安装项目所需依赖包。- 安装 nodemon,装完后,记得要配置 package.json,这样修改代码后无需重启服务。
- 安装 sequelize 与 mysql2 依赖包。这样项目里才能使用 sequelize 操作 mysql。
- 然后初始化 sequelize,会生成 ORM 所需要的目录和配置文件。记得修改 config/config.json 文件中数据库连接的配置。
npm start后,就可以通过 http://localhost:3000 来访问了。
项目建好后,就要开发实际的功能模块了:
| 命令 | 说明 |
|---|---|
sequelize db:create --charset utf8mb4 --collate utf8mb4_general_ci |
创建数据库 |
sequelize model:generate --name Article --attributes title:string,content:text |
创建模型 |
sequelize db:migrate |
运行迁移文件 |
sequelize seed:generate --name article |
创建种子文件 |
sequelize db:seed --seed xxx-article |
运行指定种子文件 |
sequelize db:seed:all |
运行所有种子文件 |
📝 使用说明
- 先要去创建数据库了。也可以使用命令创建,但在部分 Windows 中无法成功创建,那就直接使用 Navicat 手动创建也一样。
- 然后根据需求,去创建模型。记住模型是单数,但是表名是复数。并指定所需字段和类型,同时还会自动生成相关的迁移文件。
- 打开迁移文件后,根据需求人工进行调整。改完后,运行迁移命令,就会自动的创建表了。
- 可以使用种子文件,来给表中添加测试数据,而不用通过 SQL 导入默认测试数据。
- 根据需求调整种子文件。然后运行一下种子,就会自动填充数据到表里了。
- 还有个命令,它会运行所有的种子文件。缺点是无论之前有没有运行过,都会全部重新运行一次。所以这个命令只适合数据库还什么数据都没有的情况下。
💡 提示
PS:这些常用命令,大家无需背下来。因为我,也根本背不了这些。每次开发,我都是复制了,根据需求调整一下,直接拿去跑。
再来看看路由部分,路由的配置有两部分。
第一个是在根目录的 app.js 里:
先要去引用后台的文章路由文件,然后再 use 一下:
const adminArticlesRouter = require('./routes/admin/article'); app.use('/admin/articles', adminArticlesRouter);
📝
use这里,我们写好了一个路径/admin/articles,那也就是说,这个文件所有的路由,都会以这个地址为开头。
第二个部分就是在 /routes/admin/article.js 文件里每个方法上的路径配置了:
router.get('/', async function (req, res, next) { // ... 处理逻辑 });
| 请求方式 | 请求地址 | 说明 |
|---|---|---|
| GET | /admin/articles |
查询文章列表 |
| GET | /admin/articles/:id |
查询文章详情 |
| POST | /admin/articles |
创建文章 |
| PUT | /admin/articles/:id |
更新文章 |
| DELETE | /admin/articles/:id |
删除文章 |
每个路由的基础形式都是这样子。不同的是,请求方式可能是 get,也可能是 post、put 或者 delete。
而且大家在开发过程中也发现了,有好几个接口地址都是一样的,只是请求方式不同而已。
这里的请求地址,其实就两种,要么是 /admin/articles,要么就是在后面多跟上了一个 :id。但是却可以对应五个不同的路由方法,就是因为他们前面的请求方式各不相同,这样 Express 也能正确的做出区分。
⚠️ 注意
这种路由的定义方式,是非常标准的,它有一个专门的名称,叫做 RESTful。将来大家在其他地方看到 RESTful 这个单词,就要明白是怎么回事了。
其实请求方式里,还有一个 PATCH,它也是用来做修改的,它的意思是打补丁。它的推荐的场景是只更新个别字段,而不是更新整条记录的全部字段。但是这里不推荐大家使用,因为在微信小程序里,对这种请求方式的支持有问题。所以凡是修改请求,我们全部都使用直接用 PUT 好了。
| 方法 | 说明 | 例子 |
|---|---|---|
req.params |
获取路由里的参数 | /admin/articles/:id |
req.query |
获取 URL 地址里的查询参数 | /admin/articles?title=hello¤tPage=2&pageSize=20 |
req.body |
获取通过 POST、PUT 发送的数据 | 表单数据等 |
📝 三个方法的区别
req.params:是获取路由里配置了,带:号的这种数据req.query:是用来获取带?号和&符号的数据req.body:则是用来获取 POST、PUT 方式发送过来的数据,最常见的就是表单里的数据
| 方法 | 说明 |
|---|---|
findAll |
查询所有记录 |
findAndCountAll |
查询所有记录,并统计数据总数 |
findByPk |
通过主键查询单条数据 |
create |
创建新数据 |
update |
更新数据 |
destroy |
删除数据 |
这些方法就是最常用的增删改查方法了。这几个方法,都还是比较简单的,不算难。我们通过方法的名字,就能轻易的分辨,它们是用来干嘛的了。
这节课,没有开发新的接口。我们对之前所学的内容,做了一个整体的复习。在掌握了这些基础知识以后,恭喜您,您的 Node.js 技术已经略有小成了。
再往后的课程里,要学习的新知识就不算多了,更多的是真实项目实战相关的内容。
接着,我们马上要学习,如何根据项目需求,设计真实项目的数据库。还要挑战一下,如何在分分钟内,完成另一个完整的增删改查接口。