Skip to content

CheShiping/weiyang_node

Repository files navigation

Express Node Sequelize 项目学习记录

本项目是基于 Express、Node.js 和 Sequelize 的学习项目,用于掌握全栈开发技术。

学习资料

以下是在该项目中参考的学习地址:

  1. Sequelize 全栈开发指南
  2. Express 全栈开发指南

项目结构

.
├── 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 开发
  • 前端页面与后端接口对接
  • 用户认证与权限管理

Sequelize 相关概念说明

config: 是配置的意思,这里放的也就是sequelize所需要的连接数据库的配置文件。

migrations: 是迁移的意思,如果你需要对数据库做新增表、修改字段、删除表等等操作,就需要在这里添加迁移文件了。而不是像以前那样,使用客户端软件来直接操作数据库。

models: 这里面存放的是模型文件,当我们使用sequelize来执行增删改查时,就需要用这里的模型文件了。每个模型都对应数据库中的一张表。

seeders: 是存放的种子文件。一般会将一些需要添加到数据表的测试数据存在这里。只需要运行一个命令,数据表中就会自动填充进一些用来测试内容的了。

查询操作说明

实现查询操作,我们需要使用的传递参数的方式是通过 /articles?title=标题 10 这种形式来实现的。这和我们之前学的 /articles/1 这种形式非常像。它们都是 GET 请求,但是这里多了个 ?,而且是等于的这种格式。这种格式的传值方式,获取数据又不一样了,要用 req.query,这是实现通过关键词搜索东西,非常标准的做法。

白名单过滤

那解决方法很简单,就是不要用 req.body 了。我们可以将 titlecontentreq.body 取出来,如果用户提交了其他的东西,我们一概不管就可以了。通常这种方式,可以叫做白名单过滤,在有的地方也会叫做强参数过滤,不过不管怎么叫,都是一个道理。

大家再看更新文章里,也有 req.body,也是一次性接受了所有的参数。所以这里也需要使用白名单过滤一下数据。

但如果把这段代码再写一遍,又太重复了。所以我们干脆在最底部,定义一个公共的方法,专门供创建文章和更新文章使用。

安全注意事项

🔒 安全原则

永远不要相信用户提交的任何数据
用户提交的数据,一定要做过滤,只保留你需要的内容。
用户提交的数据,一定要做验证
验证最好放在模型里

可以使用 Joi 中间件制作验证规则,再用某一个(忘了)中间件自动执行验证规则,在路由的时候。

1. Node.js 项目的常用命令

两个全局包

开发 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 启动服务

📝 详细说明

  1. 创建项目,并指定不需要视图文件。还要记得,要删除 public/index.html 文件。
  2. 接着要用 cd 命令,进入项目里。
  3. npm i 安装项目所需依赖包。
  4. 安装 nodemon,装完后,记得要配置 package.json,这样修改代码后无需重启服务。
  5. 安装 sequelize 与 mysql2 依赖包。这样项目里才能使用 sequelize 操作 mysql。
  6. 然后初始化 sequelize,会生成 ORM 所需要的目录和配置文件。记得修改 config/config.json 文件中数据库连接的配置。
  7. 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 运行所有种子文件

📝 使用说明

  1. 先要去创建数据库了。也可以使用命令创建,但在部分 Windows 中无法成功创建,那就直接使用 Navicat 手动创建也一样。
  2. 然后根据需求,去创建模型。记住模型是单数,但是表名是复数。并指定所需字段和类型,同时还会自动生成相关的迁移文件。
  3. 打开迁移文件后,根据需求人工进行调整。改完后,运行迁移命令,就会自动的创建表了。
  4. 可以使用种子文件,来给表中添加测试数据,而不用通过 SQL 导入默认测试数据。
  5. 根据需求调整种子文件。然后运行一下种子,就会自动填充数据到表里了。
  6. 还有个命令,它会运行所有的种子文件。缺点是无论之前有没有运行过,都会全部重新运行一次。所以这个命令只适合数据库还什么数据都没有的情况下。

💡 提示
PS:这些常用命令,大家无需背下来。因为我,也根本背不了这些。每次开发,我都是复制了,根据需求调整一下,直接拿去跑。

2. Express 的路由配置

再来看看路由部分,路由的配置有两部分。

第一个是在根目录的 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) {
  // ... 处理逻辑
});

3. RESTful 风格路由

请求方式 请求地址 说明
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 好了。

4. 如何获取请求中的数据?

方法 说明 例子
req.params 获取路由里的参数 /admin/articles/:id
req.query 获取 URL 地址里的查询参数 /admin/articles?title=hello&currentPage=2&pageSize=20
req.body 获取通过 POST、PUT 发送的数据 表单数据等

📝 三个方法的区别

  • req.params:是获取路由里配置了,带 : 号的这种数据
  • req.query:是用来获取带 ? 号和 & 符号的数据
  • req.body:则是用来获取 POST、PUT 方式发送过来的数据,最常见的就是表单里的数据

5. 操作数据库的常用方法

方法 说明
findAll 查询所有记录
findAndCountAll 查询所有记录,并统计数据总数
findByPk 通过主键查询单条数据
create 创建新数据
update 更新数据
destroy 删除数据

这些方法就是最常用的增删改查方法了。这几个方法,都还是比较简单的,不算难。我们通过方法的名字,就能轻易的分辨,它们是用来干嘛的了。

6. 总结

这节课,没有开发新的接口。我们对之前所学的内容,做了一个整体的复习。在掌握了这些基础知识以后,恭喜您,您的 Node.js 技术已经略有小成了。

再往后的课程里,要学习的新知识就不算多了,更多的是真实项目实战相关的内容。

接着,我们马上要学习,如何根据项目需求,设计真实项目的数据库。还要挑战一下,如何在分分钟内,完成另一个完整的增删改查接口。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors