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

一个写入,一个读取

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 4.处理数据 处理数据使用koa-better-body中间件 处理get数据:ctx.request.query...
    Yytg阅读 5,646评论 0 3
  • 阅读这篇文章,你不需要听过 koa 框架,你甚至不需要使用过 node,你只需简单看懂 js。相信每一个具有 we...
    大前端艺术家阅读 5,316评论 0 4
  • 一个常见app的框架, 实现一些常用功能 TabBarController + NavigationBarCont...
    ios___developer阅读 3,240评论 0 0
  • 2017年12月25日,我的爸爸去世了。从那天起,我发觉我变得很冷静很冷漠,想哭,却无处可哭,这条软肋,也不敢被任...
    潘小某的日常阅读 3,520评论 0 0
  • “不着急”说的是对时间的态度。一个人做完该做的努力之后,就该放下,手里放下,心里放下,等。有耐心,有定力,给自己足...
    姓李名恒阅读 3,456评论 0 0

友情链接更多精彩内容