结尾
正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。
以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
- 插入用户之前,使用
bcrypt.hashSync(password,len)
进行加密
userinfo.password = bcrypt.hashSync(userinfo.password,10)
- 插入用户
- 定义
SQL
sqlStr = ‘insert into t_users set ?’
- 执行
SQL
,插入用户
db.query(sql, { username: userinfo.username, password: userinfo.password }, (err, results) => {
if (err) return res.send({ status: 201, message: err.message })
if (results.affectedRows === 1)
return res.send({ status: 200, message: ‘success’ })
return res.send({ status: 201, message: ‘注册失败,稍后再试’ })
})
- 使用
PostMan
发送注册信息,操作如下:
- 我们可以查看数据库:
如此,注册方法变成功执行了。
==========================================================================
我们在代码中多次使用到了
res.send()
方法,非常繁琐,需要封装简化代码。(不优化也没啥)
- 在
app.js
中所有的路由之前定义并注册全局中间件
server.use((req, res, next) => {
//status = 200 success
//status = 201 failure
res.cc = function (err, status = 1) {
res.send({
status: status,
message: err instanceof Error ? err.message : err,
})
}
next()
})
这样在所有的路由中,res
都具有一个cc
方法,可以方便的向客户端输出结果。
====================================================================
表单验证,前端为辅,后端为主,永远不相信前端提交的数据
1.安装joi
包,为表单项定义验证规则
npm i joi
- 安装
@escook/express-joi
,实现自动验证表单数据
npm i @escook/express-joi
- 新建
schema/auth.js
用户验证规则模块
mkdir schema
touch schema/auth.js
- 初始化如下:
//schema/auth.js
//导入包
const joi = require(‘joi’)
/**
-
string() 字符串
-
alphanum() 字符数字串
-
min(len) 最短
-
max(len) 最长
-
required() 不为空
-
pattern(reg) 符合正则
*/
//用户名密码验证规则
const username = joi.string().alphanum().min(1).max(10).required()
const password = joi.string().pattern(/1{6,12}$/).required()
//登录注册验证对象
exports.reg_login_schema = {
body: {
username,
password
}
}
- 引入验证中间件
//引入验证中间件
const expressJoi = require(‘@escook/express-joi’) //(*)
- 引入验证规则
//引入验证规则
const { reg_login_schema } = require(‘…/schema/auth’)//(*)
- 注册验证中间件
//用户注册路由,添加验证中间件
router.post(‘/register’, expressJoi(reg_login_schema), authHandler.authRegister) //(*)
修改后的route/auth.js
,如下:
//router/auth.js
const express = require(‘express’)
//创建路由对象
const router = express.Router()
//引入验证中间件
const expressJoi = require(‘@escook/express-joi’) //(*)
//引入验证规则
const { reg_login_schema } = require(‘…/schema/auth’)//(*)
//引入auth处理模块
const authHandler = require(‘…/router_handler/auth’)
//用户注册路由,添加验证中间件
router.post(‘/register’, expressJoi(reg_login_schema), authHandler.authRegister) //(*)
//用户登录路由
router.post(‘/login’, authHandler.authLogin)
//共享router对象
module.exports = router
注意以上代码中(*)
处是修改的地方。
在app.js
中创建并注册全局错误处理中间件,用于处理验证错误(也可以处理其他错误)。
- 引入验证规则
//引入验证规则模块
const joi = require(‘joi’)
- 创建并注册全局异常中间件
//引入验证规则模块
const joi = require(‘joi’)
//注册异常捕获中间件
server.use((err, req, res, next) => {
if (err instanceof joi.ValidationError) return res.cc(err)
res.cc(err)
})
================================================================
-
表单验证;
-
数据查询;
-
密码比较;
-
生成
JWT
的Token
字符串
- 修改
router/auth.js
的路由如下:
//用户登录路由
router.post(‘/login’, expressJoi(reg_login_schema), authHandler.authLogin)
在router_handler/auth.js
中的登录处理方法中:
- 表单数据接收
const userinfo = req.body
- 定义
SQL
语句
const sqlStr = ‘select * from t_users where username=?’
- 执行查询
SQL
//执行查询
db.query(sqlStr, userinfo.username, (err, results) => {
//查询失败
if (err) return res.cc(err)
//查询结果不合理
if (results.length !== 1) return res.cc(“登录失败”)
//TODO:判断密码
})
调用
bcrypt.compreSync(表单密码,数据库密码)
判断密码是否一致,true
一致,false
不一致
//判断密码
const cmpRes = bcrypt.compare(userinfo.password, results[0].password)
if (!cmpRes) return res.cc(‘Login Failed’)
//TODO:登录成功,生成token
- 从查询结果中剔除
password
和avatar
两个值
const usr = { …results[0], password: ‘’, avatar: ‘’ }
- 安装
jwt
npm i jsonwebtoken
- 在
router_handler/auth.js
中导入jwt
const jwt = require(‘jsonwebtoken’)
- 根目录创建配置文件
config.js
,并共享jwtSecretKey
字符串(用于加密)
//config.js
module.exports = {
//一个复杂字符串
jwtSecretKey: “alkjflasngaoieakgbnasdfzxfgasdf”,
expiresIn: ‘24h’,//token有效期24h
}
- 加密用户信息,生成
token
//导入config
const config = require(‘…/config’)
//生成token
const tokenStr = jwt.sign(usr, config.jwtSecretKey, {
expiresIn: config.expiresIn,//token有效期为24小时
})
- 返回客户端
res.send({
status: 200,
message: ‘login success’,
token: 'Bearer ’ + tokenStr
})
- 测试登录
- 安装
express-jwt
模块(注意版本,较新版本不适合本教程)
npm i express-jwt@5.3.3
app.js
中注册路由之前配置Token
中间件
const config = require(‘./config’)
//导入token中间件
const expressJWT = require(‘express-jwt’)
//注册token中间件,所有以/api开头的路由都需要验证token的正确性
server.use(expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^/api//] }))
app.js
中token
认证失败异常捕捉
if (err.name === ‘UnauthorizedError’) return res.cc(‘认证失败’)
- 解析验证
访问非/api
开头的路由即可,这里使用/my
想要验证成功,需要在Header
中加入Authorization
字段,字段的值是登录时返回的Token
:
====================================================================
用户中心功能的一部分,获取用户个人信息,使用/my/info
路由的GET
请求。
-
初始化个人中心路由“router/my.js”
-
初始化路由处理函数“router_handler/my.js”
-
获取用户信息
- 创建文件
router/my.js
,编辑代码如下:
// 引入express模块
const express = require(‘express’)
//创建路由对象
const router = express.Router()
//挂接/info路由
router.get(‘/info’, (req, res) => {
res.send(‘ok’)
})
//向外分享路由对象
module.exports = router
- 在
app.js
中导入当前路由模块(可以紧贴/api/auth路由向后写)
//导入路由
const myRouter = require(‘./router/my’)
//注册/my路由
server.use(‘/my’, myRouter)
- 访问
/api/auth/login
登录并获取token
复制返回的token
字符串。
- 访问
/my/info
如果你和我的编码相同,返回ok
即为正确。
- 新建
/router_handler/my.js
文件,编辑内容如下:
//暴露/my/info路由的处理函数
exports.getInfo = (req, res) => {
res.send(‘/my/info handler’)
}
- 修改
/router/my.js
文件中代码如下:
// 引入express模块
const express = require(‘express’)
//创建路由对象
const router = express.Router()
const myHandler = require(‘…/router_handler/my’) //(*)
//挂接/info路由
router.get(‘/info’, myHandler.getInfo)//(*)
//向外分享路由对象
module.exports = router
注意上述代码中(*)
处的改动。
- 测试路由处理函数
如果返回的内容和我一样就没有问题了。
- 导入
/db/index
模块
const db = require(‘…/db/index’)
- 编写SQL语句
const sql = ‘select id,username,nickname,email,avatar from t_users where id=?’
- 执行查询语句
db.query(sql, req.user.id, (err, results) => {
if (err) return res.cc(err.message)
if (results.length !== 1) return res.cc(‘获取用户信息失败’)
res.send({
status: 200,
message: ‘Success’,
data: results[0]
})
});
这样就执行成功了。
====================================================================
使用/my/info
的POST
请求更新用户个人信息。
-
定义路由
-
验证表单数据
-
更新用户信息
- 在
/router/my.js
中新增POST
路由
//更新信息
router.post(‘/info’, myHandler.setInfo)
- 添加处理函数
//router_handler/my.js
//设置用户信息
exports.setInfo = (req, res) => {
res.rend(‘post /my/info handler’)
}
- 测试路由
- 定义验证规则
新建/schema/my.js
文件,编辑如下:
//schema/my.js
//导入验证规则模块
const joi = require(‘joi’)
//定义验证规则
const id = joi.number().integer().min(1).max(10).required()
const nickname = joi.string().required()
const email = joi.string().email().required()
//导出验证规则
exports.update_info_schema = {
body: {
id,
nickname,
}
}
- 引入验证中间件
在/router/my.js
中引入express-joi
中间件
// 引入验证中间件
const express_joi = require(‘@escook/express-joi’)
- 引入验证规则
结尾
正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。
以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
router_handler/my.js
//设置用户信息
exports.setInfo = (req, res) => {
res.rend(‘post /my/info handler’)
}
- 测试路由
- 定义验证规则
新建/schema/my.js
文件,编辑如下:
//schema/my.js
//导入验证规则模块
const joi = require(‘joi’)
//定义验证规则
const id = joi.number().integer().min(1).max(10).required()
const nickname = joi.string().required()
const email = joi.string().email().required()
//导出验证规则
exports.update_info_schema = {
body: {
id,
nickname,
}
}
- 引入验证中间件
在/router/my.js
中引入express-joi
中间件
// 引入验证中间件
const express_joi = require(‘@escook/express-joi’)
- 引入验证规则
结尾
正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。
以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
[外链图片转存中…(img-9F0QyKne-1715691047538)]
\S ↩︎