0%

express

数据库

  • 使用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
      5
      mysql>  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
      3
      ALTER 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
  • 使用delete语句会把真正的数据从表中删除,为了保险起见,推荐使用标记删除的形式,设置status状态字段,标记该数据是否被删除(1表示删除)–>转化为update

两种web开发模式

  • 服务端渲染:服务器发送给客户端html页面,是服务器通过字符串的拼接动态生成的,因此客户端不需要使用Ajax这样的技术额外请求页面的数据
  • 前后端分离:依赖于Ajax技术的广泛使用,后端只负责提供API接口,前端使用Ajax调用接口
  • 如何选择?
    • 企业级网站:主要功能是展示而没有复杂交互,需要良好的SEO,使用服务端渲染
    • 后台管理:交互性比较强,不需要考虑SEO,前后端分离 (可以利用vue,react提供的SSR技术解决SEO问题)
    • 有时候为了同时兼顾首页的加载速度和前后端分离的开发效率,采用首屏服务端渲染+其他页面前后端分离开发模式

      身份认证

  • 服务端推荐采用Session认证机制 前后端分离推荐使用JWT认证机制
  • 存储在用户浏览器中一段不超过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
    7
    const 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
2
app.use(express.json())//解析raw json格式数据 否则req.body undefined
app.use(express.urlencoded({extended:false}))//解析urlecoded格式数据,否则req.body为空对象
  • 自定义中间件

npm与包

  • 包的语义化版本规范:大版本 功能版本 Bug修复版本
  • npm uninsall 指定包名 开发依赖:-D/–save-dev(devDependencies/开发依赖包只用于开发,dependencies/核心依赖包开发和上线都能用到)

references

http://escook.cn:8088/