Koa2框架

koa-generator

安装(-g 全局安装的意思)

npm install -g koa-generator

创建项目
koa2 project
//或者
koa2 -e project

然后初始化项目

npm i

使用npm run dev运行会监听实时更新 因为执行了nodemon

async和await语法

1.如果代码有async声明一个函数,这个函数是异步的。如果外部没有声明async,里面不能使用await.反之则声明了async里面可以没有await。
2.async和new Promise的区别是,Promise有多个事情,比如a,b,c通过a.then.then去处理b和c事情。而async是类似写成同步的样子,如下面代码//2这部分,a,b,c都是异步的过程,a的结果 等于这个a执行完,拿到是执行完的结果,在拿到结果之前不会运行下面的语句,而会等待。所以async就等于用同步的写法,完成异步的过程。

router.get('/', async (ctx, next) => {
  const a = await A;//2 伪代码
  const b = await B;//2 伪代码
  const c = await C;//2 伪代码
  await ctx.render('index', {
    title: 'Hello Koa 2!'
  })
})

3.用async声明一个异步函数,

异步的概念

就是先执行第一句console.log('start'),然后要等待异步返回resolve('a'),最后才执行下面的ctx.body={a},所以刷新浏览器接口的时候会卡顿了大概1秒左右,就是因为await会等待结果,才执行最后的返回body的代码。如果把await去掉,就会先执行第一句,然后输出最后一句,最后浏览器返回body的a就是没有内容的。再执行倒计时里面的,这样就没意义了。这样写起来就类似同步的方法,没有.then这样链式写下去。const a 的结果 就是resolve('a')返回的结果.如果await后面跟这不是Promise对象,也会自动帮你转换成Promise对象(所以const b = await Promise.resolve(123)也是可以的)。所以用async和await就可以让异步的过程,按照我们的顺序去执行。因为我们有时需要等待a返回的结果,才执行最后的代码,这样写起来就没有异步回调的做法。比较简洁。
理解asynv和await


image.png

image.png

这种就是多个回调的写法,按顺序执行的,一共耗时3秒,中间那个忽略不算因为是直接输出的。
await是按顺序执行下去的。

koa2中间件

koa2中间件的原理
1.request是浏览器发出的请求
2.response响应给浏览器的结果
3.中间件引入是有顺序的,引用的时候没有顺序。要理解引用的顺序不一样,执行的结果一样。
4.中间件一定要加await next(),不然下面的中间件不会执行,直接跳出


image.png

原理是一进一出,先进后出,就不怕里面设置变量可能会被下个中间件改掉。因为最后还是会触发你那里的函数,可以检查她是否改掉,改掉还可以改回来。
m1,m2,m3文件代码如下,最后输入如下图,所以打印出来的 如上面的洋葱图一样。


image.png
image.png

中间件demo

// app.js 文件内容
const pv = require('./middleware/koa-pv')//引入中间件
app.use(pv())//使用中间件,里面的调用函数的意思
// ./middleware/koa-pv文件内容
//ctx是进入app的一个对象,会全局挂载着所有的信息,包括两方面(req,res的信息)。整个app都能拿到的全局对象,用来维持req和res两边的信息
function pv(ctx){
  global.console.log('pv',ctx.path)
}
//最后一定要把你的处理结果导出,且导出是一个函数(为什么是函数,因为app.use(pv()),里面就是调用函数的意思)
module.exports=function(){
  //这个函数必须返回一个异步的
  return async function(ctx,next){
    //ctx的信息可以在官网的上下文Context中查看对于的属性
    pv(ctx)
    //当前这个中间件处理完毕后,交给下一个中间件
    await next() //代表洋葱里面执行下一个圈,否则会跳出
  }
}

//app.js文件添加
app.use(pv())//使用中间件

自定义koa2中间件


image.png

一定要写await next() 执行下一个中间件

koa2路由

const router = require('koa-router')() //引用这个中间件,生成一个实例
//实例上会有下面的两个方法
//router.get()
//router.post()
//这是渲染页面的
router.get('/',async(ctx,next)=>{
  await ctx.render('index',{
    title:'Hello Koa 2!'
  } )
})
//这是返回接口的
router.get('/',async(ctx,next)=>{
  ctx.body={
    title:'koa2 json'
  }
})
//ctx.body='koa2 string' //如果里面写这样就是返回字符串,上面那个是返回json数据
----------------------------------------------------------------------------------
//在routers文件下users.js
router.prefix('/users') //意思就是要在url前缀加上/users/bar才可以访问
router.get('/bar',async(ctx,next)=>{
  ctx.body={
    title:'koa2 json'
  }
})
//最后一定要导出
module.exports = router

--------------------------------------------------------------------------------
//app.js引用
const users = require('./routers/users') //导入
app.use(users.routers(),users.allowedMethods()) //使用这个中间件

cookie和session

1.访问首页就注入一个cookie,叫pvid,用浏览器f12可以查看到
2.访问json接口可以读取到刚才设置的cookie


image.png

一个写入,一个读取

你可能感兴趣的:(Koa2框架)