课程目标
@掌握Koa基本用法 @理解Koa设计思路 @路由 @静态文件服务 @模板引擎
koa 概述:koa是一个新的Web框架,致力于成为Web应用和api开发领域中的一个更小,更富有表现力,更健壮的基石
koa是express的下一代基于node.js的web框架
koa2完全使用Promise并配合async来实现异步
特点: 轻量 无捆绑 中间件架构 优雅的api设计 增强错误处理
安装: npm i koa -S
中间件机制、请求、响应处理
中间件的作用是什么 ?
对于我们业务程序的描述有两种需要,一种是顺序的需要,同时也有一种非顺序描述的需要,也可以说是一种横向的业务描述的需要,比如鉴权,每次开始的时候需要处理,错误处理 每次到头部的时候 包括统一加头部,这些都可以认为是一种横向业务描述的需要,这些统称为AOP编程(面向切面编程)
中间件内错误捕捉和全局内错误捕捉
路由: npm i -S koa-router
在index.js中引入
静态文件服务: npm i -S koa-static
模板引擎: npm i koa-hbs@next -S
引入并配置,app.js
创建views,views/partials,layout.hbs,index.hbs layout.hbs:
渲染,./routes/index.js
三种常见的鉴权方式 1 session / cookie 2 token 3 oAuth
1, session / cookie 方式
创建http.createServer服务,res.setHeader('Set-Cookie','cx=abc') 设置cookie, 启动服务可以在application中看到cx abc的cookie信息 观察一下network 在我在发送localhost的3000的请求的时候,它会response headers里发 Set-Cookie:cx=abc cookie的原理是默认同域的情况下会发送cookie Cookie: cx=abc ,response回应的时候如果浏览器收到让你setCookie这样儿一个header的时候,它就会设置这个cookie,如果下次再走这个请求的时候,它就会自动带上这个cookie,作用就是建立一种前端的状态的保存,回传给他,这样儿如果后端想在前端放置一个状态的时候,我就可以有这样一种方法,比如说我就可以设置很多信息了,比如前端的登录态,使用这个cookie形成一种session机制。
下面我们看一下session:
说到session的话,我们怎么记录登录态或者说记录用户信息,假如每一个用户有一个唯一的标识用 const sid = (Math.random() * 9999).toFixed() , 我们设置setHeader时可以这样儿设置res.setHeader('Set-Cookie',`sid = ${sid}`)
同时我们可以在后端访问的话,我们可以整一个键值对 const session = {} 设置 session[sid] = { name: 'wang' }
实现原理:1,服务器在接受客户端首次访问时在服务器创建session,然后保存session(我们可以保存在session中,也可以保存在redis中,推荐使用后者),然后给这个session生成一个唯一的标识字符串,然后的响应头种下这个唯一标识字符串。
2,签名,这一步通过秘钥对sid进行签名处理,避免客户端修改sid(非必须步骤)
3,浏览器中收到请求响应的时候会解析响应头,然后将sid保存在本地的cookie中,浏览器在下次http请求的请求头中会带上该域名下的cookie信息
4,服务器在接受客户端请求时会去解析请求头cookie中的sid,然后根据这个Sid去找服务器端保存的该客户端的session,然后判断该请求是否合法。
koa鉴权
当SESS_CONFIG的signed为true时,会对签名的加密主体进行一次哈希,哈希其实就是一种摘要算法,原意是把一个不定长摘要出一个定长结果,并且它本身是一种摘要,具有雪崩效应。
摘要:是一种不可逆的算法起到一种防篡改的作用,雪崩效应:密文略有变化 ,明文就会发生巨大的变化,这种不可推算的效应。
token验证
1.客户端使用用户名和密码请求登录
2.服务端收到请求,去验证用户名与密码
3.验证成功后,服务端会签发一个令牌(token) ,再把这个token发送给客户端
4.客户端收到token以后可以把它存储起来,比如放在cookie里或者local storage里
5.客户端每次向服务端请求资源的时候需要带着服务端签发的token
6.服务端收到请求然后去验证客户端的请深圳市里面带着的Token 如果验证成功,就向客户端返回请求的数据
OAuth(开放授权)
概念:三方登入主要基本于OAuth 2.0 OAuth协议为用户资源的授权提供了一个案例的,开放而又简易的标准,与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的账号信息,如用户名与密码,即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的
OAUTH的登录流程
补充材料:
当你想用异步程序描写同步操作的时候就很麻烦了。https://github.com/su37josephxia/frontend-basic/blob/master/src/callback/index.js (参考前端大班车)
EventLoop是什么 : 事件循环被称作循环的原因在于,它一直在查找新的事件并且执行。一次循环的执行称之为 tick, 在这个循环里执行的代码称作 task,event loop顾名思义就是事件循环,为什么要有事件循环呢?因为V8是单线程的,即同一时间只能干一件事情,但是呢文件的读取,网络的IO处理是很缓慢的,并且是不确定的,如果同步等待它们响应,那么用户就起飞了。于是我们就把这个事件加入到一个 事件队列里(task),等到事件完成时,event loop再执行一个事件队列。
setTimeout / setImmediate / process.nextTick的区别 (https://blog.csdn.net/hkh_1012/article/details/53453138)
v8引擎单线程无法同时干两件事
文件读取 网络IO缓慢具有不确定性
要通过异步回调的方式处理又称为异步io
先同步再异步 异步放入队列等同步完成后再执行 每次循环叫一个tick(process.nextTick())
异步任务的区分
microtasks(微任务)
唯一整个事件循环当中,仅存在一个,执行为同步,同一个事件循环中的microtask按队列顺序,串行执行完毕; process.nextTick / promise / Object.observe / MutationObserver
tasks(宏任务)
setTimeout / setInterval / setImmediate / I/O / UI渲染
先执行微任务 再执行宏任务
========================================================================
Restful API 及常见任务