数据库
- 使用mysql模块操作MySQL数据库 npm i mysql
- 使用docker run -itd –name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql在docker中创建mysql容器
- 使用navicat连接数据库(localhost root 123456 3306(尽量用3306端口))
- 出错1:ER_ACCESS_DENIED_ERROR: Access denied for user ‘root‘@’172.17.0.1’ (using password: YES)
1
2
3
4
5mysql> CREATE USER 'root'@'172.17.0.1' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.17.0.1' WITH GRANT OPTION;
mysql> flush privileges;
mysql> exit
参考:https://medium.com/tech-learn-share/docker-mysql-access-denied-for-user-172-17-0-1-using-password-yes-c5eadad582d3 - 出错2:ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
1
2
3ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
flush privileges;
参考:https://stackoverflow.com/questions/50093144/mysql-8-0-client-does-not-support-authentication-protocol-requested-by-server
- 出错1:ER_ACCESS_DENIED_ERROR: Access denied for user ‘root‘@’172.17.0.1’ (using password: YES)
- 使用delete语句会把真正的数据从表中删除,为了保险起见,推荐使用标记删除的形式,设置status状态字段,标记该数据是否被删除(1表示删除)–>转化为update
两种web开发模式
- 服务端渲染:服务器发送给客户端html页面,是服务器通过字符串的拼接动态生成的,因此客户端不需要使用Ajax这样的技术额外请求页面的数据
- 前后端分离:依赖于Ajax技术的广泛使用,后端只负责提供API接口,前端使用Ajax调用接口
- 如何选择?
- 服务端推荐采用Session认证机制 前后端分离推荐使用JWT认证机制
Cookie
- 存储在用户浏览器中一段不超过4KB的字符串,不同域名下的Cookie各自独立,每当客户端发送请求时,会自动把当前域名下所有未过期的Cookie一同发送到服务器 (自动发送 域名独立 过期时限 4KB限制)
- 客户端第一次请求服务器的时候,服务器通过响应头的形式向客户端发送一个身份认证的Cookie,客户端会自动保存到浏览器中;随后当客户端浏览器每次请求服务器时,浏览器自动将身份认证相关的Cookie通过请求头的形式发送给服务器,服务器即可验证客户端身份
- Cookie不具有安全性(用户可以伪造Cookie)
Session
Token
中间件
本质上是一个function处理函数,形参列表中必须包含next参数,next函数是实现多个中间件连续调用的关键,把流转关系转交给下一个中间件或路由(路由是最终处理环节)
- 作用:多个中间件之间,共享同一份req和res,因此可以在上游中间件中统一为req和res对象添加自定义的属性或方法,供下游的中间件或路由进行使用
- 全局生效中间件:客户端发送的任何请求到达服务器后都会触发的中间件;
- 方式:调用app.use(中间件函数)
- 定义多个全局中间价:使用app.use()连续定义多个全局中间件,客户端请求到达服务器之后,会按照中间件定义的先后顺序依次调用
docker+express搭建后端并发布 - 局部生效中间件:不使用app.use()
1
2
3
4
5
6
7const mw1 = function(req,res,next){
console.log("这是中间件函数")
next()
}
app.get('/',[mw1,mw2],function(req,res){
res.send('Home page')
})//mw只会影响当前路由 - 注意事项
- 一定要在路由之前注册中间件
- 分类
- 应用级别 绑定到app上
- 路由级别 绑定到router上
- 错误级别 必须4个形参(err,req,res,next) 必须注册在所有路由之后
- Express内置 express.static .json .urlencoded
- 第三方
默认情况下,如果不配置解析表单数据的中间件,则req.body默认等于undefined
1 | app.use(express.json())//解析raw json格式数据 否则req.body undefined |
- 自定义中间件
npm与包
- 包的语义化版本规范:大版本 功能版本 Bug修复版本
- npm uninsall 指定包名 开发依赖:-D/–save-dev(devDependencies/开发依赖包只用于开发,dependencies/核心依赖包开发和上线都能用到)
references