Koa2学习笔记

236 阅读3分钟

Koa2学习

  • await相关
    • await可以被视作是async+await的简写,也就是用来等待async的结果
    • await只能在async声明的函数中使用
    • async永远返回一个Promise对象
  • queryquerystring的区别
    • koa2GET请求通过request接受,接受的方法有两种:queryquerystring
      • query:返回的是格式化好的参数对象
      • querystring: 返回的是请求字符串,需要对字符串进行进一步处理
  • koa2中获取post请求的步骤:
  1. 解析上下文ctx中的原生nodex.js对象req(和request不一样)
  2. 将POST表单数据解析成querystring字符串,例如: user=chase&age=23
  3. 将字符串转换为JSON格式
  • ctx.requestctx.req 的区别
  1. ctx.requestkoa2context经过封装的请求对象,用起来更加直观和简单
  2. ctx.reqcontext提供的node.js原生http请求对象,用起来虽然不是很直观,但是可以获得更多的内容

中间件

  • koa-bodyparser:
    • post请求直接转换到ctx.request.body
    • 可以直接帮忙把querystring转换为键值对形式的JSON对象
    const bodyparser = require('koa-bodyparser');
    app.use(bodyparser());
    
    let displayData = ctx.request.body; //bodyparser已经处理好了数据存放在body中

路由

  • fs.readFile(pageUrl, 'binary', (err, data)=>{}) 第二个参数表明以什么样的形式来读取数据
  • 可以手写路由,也可以直接调用koa-router中间件:
    const Router = require('koa-router');
    const router = new Router;
    router.get('/',(ctx, next)=>{})

    app.use(router.routes()).use(router.allowedMethods());
  • allowedMethods()方法表明该路由只支持GET请求,如果发送POST请求,则报错
  • 在路由添加层级的方法:
    • 在new出来的router对象中添加:
    const router = new Router({prefix:'/chase'})
    //prefix就是添加的层级的名字,添加后该router下的所有路由默认从/chase/开头
  • 使用中间件koa-router来创建父子路由
    • 先创建子级路由
    let home = new Router();
    
    home
    .get('/chase',async(ctx)=>{
        ctx.body = '子级路由home下的Chase页面'
    })
    .get('/todo', async(ctx)=>{
        ctx.body = '子级路由home下的todo Page'
    })
- 创建父级路由并把子级路由装载在父级路由上
    const router = new Router();//该router是父级路由
    router.use('/home', home.routes(), home.allowedMethods());//只支持GET请求
    
    app
        .use(router.routes())
        .use(router.allowedMethods());

Cookie的使用

  • 使用:
    • ctx.cookies.set('MyName', 'Chase');
    • 也可以为某个键值对设置一系列属性,包括过期时间、是否允许重写(overwrite)、httpOnly等
    ctx.cookies.set(
        'MyName', 'Chase', {
            domain:'127.0.0.1',
            
            path:'/index', 
            //这样设置表明只允许在index及以下的子路由中使用cookie
            //如果不设置path则代表整个domain下的所有路由都可以使用cookie
            maxAge: 1000*60*60*24, //默认毫秒为单位
            expires: new Date('2022-3-25'), //绝对时间
            httpOnly: false,
            overwrite: false //不允许
        }
    )
    
    //别的地方读取cookie
    ctx.body = ctx.cookies.get('MyName'); //get(键名)

ejs模版引擎

  • 使用:npm install --save koa-views, npm install --save ejs
  • 应用:
    • 首先引入该中间件以及node原生的path
    const views = require('koa-views');
    const path = require('path');
  • 应用该中间件引入ejs渲染文件,然后将其渲染
    app
        .use(views(
            path.join(__dirname, './view'),  //view下存页面文件
            {
                extension:'ejs'              //使用ejs文件
            }
        ))
        .use(async(ctx)=>{
            let title = 'hello chase';
            await ctx.render('index', {title})  
            //直接使用ctx的render API将index.ejs文件渲染到页面上
        })

访问静态资源

  • 静态资源包括:css、图片、js文件等
  • 需要使用koa-static中间件 const static = require('koa-static');
  • 添加静态资源的路径:
    • app.use(static(path.join(__dirname, staticPath)));

    • 之后就可以在url中直接加静态资源名称来访问静态资源