内容
下面要用前面所学的知识做一个后台管理项目
1. 初始化项目
1.1 创建项目
1.新建api_server文件夹作为项目根目录,在项目根目录中初始化包管理配置文件(package.json):
cd api_server
npm init -y

2. 安装指定版本的express
npm i express@4.17.1

3. 在项目根目录中,新建app.js作为整个项目的入口文件,并初始化如下代码:

1.2 配置cors跨域
1.安装cors中间件
npm i cors
2.在app.js中导入并配置cors中间件

1.3 配置解析表单数据的中间件
⚠️:这个中间件,只能解析 application/x-www-form-urlencoded格式的表单数据
(app.use(express.json())可以解析application/json格式的表单数据)

1.4 初始化路由相关的文件夹
- 在项目根目录中,新建
router文件夹,用来存放所有的路由模块
路由模块中,只存放客户端请求与服务器处理函数之间的映射关系 - 在项目根目录中,新建
router_handler文件夹,用来存放所有的路由处理函数模块
路由处理函数模块中,只存放每个路由对应的处理函数

1.5 初始化用户路由模块
1.在router文件夹中,新建user.js文件,作为用户的路由模块,并初始化如下代码:

2.在app.js中,导入并使用用户路由模块:

打开postman测试一下刚刚的接口


没有问题👍
1.6 抽离用户路由模块中的处理函数
为了保证路由模块的纯粹性,所有的路由处理函数,必须抽离到对应的路由处理函数模块中
1.在router_handler文件夹中,新建user.js,并使用exports向外导出路由处理函数

2.将router/user.js中的代码如下进行修改:
这样保证在router中只存放客户端请求与服务器处理函数之间的映射关系,不存放每个路由对应的处理函数

2. 实现登录注册功能
2.1 在数据库中新建users表

这个pictrue是用户头像,TEXT也是字符串,但是没有长度限制
2.2 安装并配置mysql模块
1.安装mysql模块
npm i mysql
2.在项目根目录中新建文件夹database,在database中新建index.js文件,在里面配置mysql模块


2.3 注册功能
实现步骤:
1.检测表单数据是否合法
其实也就是判断用户名和密码是否为空,这个代码我们应该写在router_handler/user.js的路由处理函数中

2.检测用户名是否被占用

3.对密码进行加密处理
为了保证密码的安全性,不建议在数据库以明文的形式保存用户密码,最好对密码进行加密存储
我们使用一个第三方的包bcryptjs对用户密码进行加密,优点:
- 加密后的密码,无法被逆向破解
- 同一明文密码进行多次加密,得到的加密结果各不相同
安装bcryptjs:
npm i bcryptjs
在router_handler/user.js中导入bcryptjs,在确定用户名可用之后,调用bcrypt.hashSync()对用户密码进行加密

4.插入新用户

2.4 优化res.send()代码
在处理函数中,需要多次调用res.send()向客户端响应处理失败得结果

为了简化代码,可以手动封装一个res.cc()函数:
在app.js中,所有路由之前,声明一个全局中间件,为res对象挂载一个res.cc()函数


2.5 优化表单数据验证
表单验证的原则:前端验证为辅,后端验证为主,后端永远不要相信前端提交过来的任何内容
在实际开发中,前后端都需要对表单的数据进行合法性的验证。而且,后端作为数据合法性验证的最后一个关口,在拦截非法数据方面,起到了至关重要的作用
单纯地使用if...else...的形式对数据合法性进行验证,效率低下、出错率高、维护性差

(以后可能对数据的验证有更多要求,那么过多的if…else…)
因此推荐使用第三方数据验证模块,来降低出错率、效率和可维护性
1.安装joi包,为表单中携带的每个数据项,定义验证规则:
npm i joi
2.安装@escook/express-joi中间件,来实现自动对表单数据进行验证的功能:
npm i @escook/express-joi
3.新建文件夹schema,在schema中新建user.js,为用户信息验证规则模块,并初始化代码如下:

4.修改/router/user.js中的代码如下:

5.在app.js中定义全局错误级别中间件,捕获验证失败的错误,并将错误响应给客户端

⚠️:错误级别的中间件必须注册在所有路由之后


2.6 登录功能
实现步骤:
1.检测表单数据是否合法
就继续使用上面的第三方数据验证模块即可,将/router/user.js中登录的路由代码修改:

2.根据用户名查询用户的数据

3.判断用户输入的密码是否正确
核心实现思路:调用bcrypt.compareSync(用户提交密码,数据库中密码)比较密码是否一致,返回值是布尔值

4.生成JWT的Token字符串
⚠️:在生成Token字符串的时候,一定要剔除密码和头像的值
安装生成Token字符串的包:
npm i jsonwebtoken
创建config.js文件,并向外共享加密和解密的secret密钥:

在/router_handler/user.js中导入jsonwebtoken包和全局配置config.js

(用户信息要剔除掉密码和头像的值)
(这里token直接拼上了Bearer方便客户端使用,也可以在客户端拼接)

2.7 配置解析 Token 的中间件
1.安装解析 Token的中间件
npm i express-jwt
2.在app.js中注册路由之前,配置中间件:

3.在app.js中的全局错误处理中间件里,捕获并处理 Token 认证失败后的错误











