下面要用前面所学的知识做一个后台管理项目
1.新建api_server
文件夹作为项目根目录,在项目根目录中初始化包管理配置文件
(package.json
):
cd api_server
npm init -y
npm i express@4.17.1
3. 在项目根目录中,新建app.js
作为整个项目的入口文件,并初始化如下代码:
1.安装cors
中间件
npm i cors
⚠️:这个中间件,只能解析 application/x-www-form-urlencoded
格式的表单数据
(app.use(express.json())
可以解析application/json
格式的表单数据)
router
文件夹,用来存放所有的路由模块
客户端请求
与服务器处理函数
之间的映射关系router_handler
文件夹,用来存放所有的路由处理函数模块
处理函数
1.在router
文件夹中,新建user.js
文件,作为用户的路由模块,并初始化如下代码:
2.在app.js
中,导入并使用用户路由模块
:
打开postman测试一下刚刚的接口
没有问题
为了保证路由模块
的纯粹性,所有的路由处理函数
,必须抽离到对应的路由处理函数模块
中
1.在router_handler
文件夹中,新建user.js
,并使用exports
向外导出路由处理函数
2.将router/user.js
中的代码如下进行修改:
这样保证在router
中只存放客户端请求
与服务器处理函数
之间的映射关系,不存放每个路由对应的处理函数
这个pictrue是用户头像,TEXT
也是字符串,但是没有长度限制
1.安装mysql
模块
npm i mysql
2.在项目根目录中新建文件夹database
,在database
中新建index.js
文件,在里面配置mysql
模块
实现步骤:
1.检测表单数据是否合法
其实也就是判断用户名和密码是否为空,这个代码我们应该写在router_handler/user.js
的路由处理函数中
2.检测用户名是否被占用
3.对密码进行加密处理
为了保证密码的安全性,不建议在数据库以明文
的形式保存用户密码,最好对密码进行加密存储
我们使用一个第三方的包bcryptjs
对用户密码进行加密,优点:
安装bcryptjs
:
npm i bcryptjs
在router_handler/user.js
中导入bcryptjs
,在确定用户名可用之后,调用bcrypt.hashSync()
对用户密码进行加密
在处理函数中,需要多次调用res.send()
向客户端响应处理失败
得结果
为了简化代码,可以手动封装一个res.cc()
函数:
在app.js
中,所有路由之前,声明一个全局中间件,为res
对象挂载一个res.cc()
函数
表单验证的原则:前端验证为辅,后端验证为主,后端永远不要相信前端提交过来的任何内容
在实际开发中,前后端都需要对表单的数据进行合法性的验证。而且,后端作为数据合法性验证的最后一个关口,在拦截非法数据方面,起到了至关重要的作用
单纯地使用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
中定义全局错误级别中间件,捕获验证失败的错误,并将错误响应给客户端
⚠️:错误级别的中间件必须注册在所有路由之后
实现步骤:
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
方便客户端使用,也可以在客户端拼接)
1.安装解析 Token
的中间件
npm i express-jwt
2.在app.js
中注册路由之前,配置中间件:
3.在app.js
中的全局错误处理中间件里,捕获并处理 Token
认证失败后的错误