node.js实战记录1 初始化项目、实现登录注册功能

内容

  • 1. 初始化项目
    • 1.1 创建项目
    • 1.2 配置cors跨域
    • 1.3 配置解析表单数据的中间件
    • 1.4 初始化路由相关的文件夹
    • 1.5 初始化用户路由模块
    • 1.6 抽离用户路由模块中的处理函数
  • 2. 实现登录注册功能
    • 2.1 在数据库中新建users表
    • 2.2 安装并配置mysql模块
    • 2.3 注册功能
    • 2.4 优化res.send()代码
    • 2.5 优化表单数据验证
    • 2.6 登录功能
    • 2.7 配置解析 Token 的中间件


下面要用前面所学的知识做一个后台管理项目

1. 初始化项目

1.1 创建项目

1.新建api_server文件夹作为项目根目录,在项目根目录中初始化包管理配置文件(package.json):

 cd api_server
 npm init -y

node.js实战记录1 初始化项目、实现登录注册功能_第1张图片
2. 安装指定版本的express

npm i express@4.17.1

node.js实战记录1 初始化项目、实现登录注册功能_第2张图片
3. 在项目根目录中,新建app.js作为整个项目的入口文件,并初始化如下代码:
node.js实战记录1 初始化项目、实现登录注册功能_第3张图片


1.2 配置cors跨域

1.安装cors中间件

npm i cors

2.在app.js中导入并配置cors中间件
node.js实战记录1 初始化项目、实现登录注册功能_第4张图片


1.3 配置解析表单数据的中间件

⚠️:这个中间件,只能解析 application/x-www-form-urlencoded格式的表单数据
(app.use(express.json())可以解析application/json格式的表单数据)
node.js实战记录1 初始化项目、实现登录注册功能_第5张图片


1.4 初始化路由相关的文件夹

  • 在项目根目录中,新建router文件夹,用来存放所有的路由模块
    路由模块中,只存放客户端请求服务器处理函数之间的映射关系
  • 在项目根目录中,新建router_handler文件夹,用来存放所有的路由处理函数模块
    路由处理函数模块中,只存放每个路由对应的处理函数
    node.js实战记录1 初始化项目、实现登录注册功能_第6张图片

1.5 初始化用户路由模块

1.在router文件夹中,新建user.js文件,作为用户的路由模块,并初始化如下代码:
node.js实战记录1 初始化项目、实现登录注册功能_第7张图片
2.在app.js中,导入并使用用户路由模块
node.js实战记录1 初始化项目、实现登录注册功能_第8张图片
打开postman测试一下刚刚的接口
node.js实战记录1 初始化项目、实现登录注册功能_第9张图片node.js实战记录1 初始化项目、实现登录注册功能_第10张图片
没有问题


1.6 抽离用户路由模块中的处理函数

为了保证路由模块的纯粹性,所有的路由处理函数,必须抽离到对应的路由处理函数模块

1.在router_handler文件夹中,新建user.js,并使用exports向外导出路由处理函数
node.js实战记录1 初始化项目、实现登录注册功能_第11张图片
2.将router/user.js中的代码如下进行修改:
这样保证在router中只存放客户端请求服务器处理函数之间的映射关系,不存放每个路由对应的处理函数
node.js实战记录1 初始化项目、实现登录注册功能_第12张图片


2. 实现登录注册功能

2.1 在数据库中新建users表

node.js实战记录1 初始化项目、实现登录注册功能_第13张图片
这个pictrue是用户头像,TEXT也是字符串,但是没有长度限制


2.2 安装并配置mysql模块

1.安装mysql模块

npm i mysql

2.在项目根目录中新建文件夹database,在database中新建index.js文件,在里面配置mysql模块
node.js实战记录1 初始化项目、实现登录注册功能_第14张图片
node.js实战记录1 初始化项目、实现登录注册功能_第15张图片


2.3 注册功能

实现步骤:
1.检测表单数据是否合法
其实也就是判断用户名和密码是否为空,这个代码我们应该写在router_handler/user.js的路由处理函数中
node.js实战记录1 初始化项目、实现登录注册功能_第16张图片
2.检测用户名是否被占用
node.js实战记录1 初始化项目、实现登录注册功能_第17张图片

3.对密码进行加密处理
为了保证密码的安全性,不建议在数据库以明文的形式保存用户密码,最好对密码进行加密存储

我们使用一个第三方的包bcryptjs对用户密码进行加密,优点:

  • 加密后的密码,无法被逆向破解
  • 同一明文密码进行多次加密,得到的加密结果各不相同

安装bcryptjs

npm i bcryptjs

router_handler/user.js中导入bcryptjs,在确定用户名可用之后,调用bcrypt.hashSync()对用户密码进行加密
node.js实战记录1 初始化项目、实现登录注册功能_第18张图片

4.插入新用户
node.js实战记录1 初始化项目、实现登录注册功能_第19张图片


2.4 优化res.send()代码

在处理函数中,需要多次调用res.send()向客户端响应处理失败得结果
node.js实战记录1 初始化项目、实现登录注册功能_第20张图片
为了简化代码,可以手动封装一个res.cc()函数:
app.js中,所有路由之前,声明一个全局中间件,为res对象挂载一个res.cc()函数
node.js实战记录1 初始化项目、实现登录注册功能_第21张图片
node.js实战记录1 初始化项目、实现登录注册功能_第22张图片


2.5 优化表单数据验证

表单验证的原则:前端验证为辅,后端验证为主,后端永远不要相信前端提交过来的任何内容

在实际开发中,前后端都需要对表单的数据进行合法性的验证。而且,后端作为数据合法性验证的最后一个关口,在拦截非法数据方面,起到了至关重要的作用

单纯地使用if...else...的形式对数据合法性进行验证,效率低下、出错率高、维护性差
node.js实战记录1 初始化项目、实现登录注册功能_第23张图片
(以后可能对数据的验证有更多要求,那么过多的if…else…)

因此推荐使用第三方数据验证模块,来降低出错率、效率和可维护性

1.安装joi包,为表单中携带的每个数据项,定义验证规则

npm i joi

2.安装@escook/express-joi中间件,来实现自动对表单数据进行验证的功能:

npm i @escook/express-joi

3.新建文件夹schema,在schema中新建user.js,为用户信息验证规则模块,并初始化代码如下:
node.js实战记录1 初始化项目、实现登录注册功能_第24张图片
4.修改/router/user.js中的代码如下:
node.js实战记录1 初始化项目、实现登录注册功能_第25张图片
5.在app.js中定义全局错误级别中间件,捕获验证失败的错误,并将错误响应给客户端
node.js实战记录1 初始化项目、实现登录注册功能_第26张图片
⚠️:错误级别的中间件必须注册在所有路由之后

node.js实战记录1 初始化项目、实现登录注册功能_第27张图片node.js实战记录1 初始化项目、实现登录注册功能_第28张图片


2.6 登录功能

实现步骤:
1.检测表单数据是否合法
就继续使用上面的第三方数据验证模块即可,将/router/user.js中登录的路由代码修改:
在这里插入图片描述
2.根据用户名查询用户的数据
node.js实战记录1 初始化项目、实现登录注册功能_第29张图片
3.判断用户输入的密码是否正确
核心实现思路:调用bcrypt.compareSync(用户提交密码,数据库中密码)比较密码是否一致,返回值是布尔值
node.js实战记录1 初始化项目、实现登录注册功能_第30张图片
4.生成JWT的Token字符串
⚠️:在生成Token字符串的时候,一定要剔除密码头像的值

安装生成Token字符串的包:

npm i jsonwebtoken

创建config.js文件,并向外共享加密解密的secret密钥:
node.js实战记录1 初始化项目、实现登录注册功能_第31张图片
/router_handler/user.js中导入jsonwebtoken包和全局配置config.js
node.js实战记录1 初始化项目、实现登录注册功能_第32张图片
(用户信息要剔除掉密码和头像的值)
(这里token直接拼上了Bearer方便客户端使用,也可以在客户端拼接)
node.js实战记录1 初始化项目、实现登录注册功能_第33张图片


2.7 配置解析 Token 的中间件

1.安装解析 Token的中间件

npm i express-jwt

2.在app.js中注册路由之前,配置中间件:
node.js实战记录1 初始化项目、实现登录注册功能_第34张图片
3.在app.js中的全局错误处理中间件里,捕获并处理 Token 认证失败后的错误
node.js实战记录1 初始化项目、实现登录注册功能_第35张图片


你可能感兴趣的:(node.js,node.js,express)