美文网首页
koa2.x学习1

koa2.x学习1

作者: kevin5979 | 来源:发表于2020-11-04 09:04 被阅读0次

Koa2.x学习

开发思路和 express 差不多,最大的特点就是可以避免异步嵌套

官网:http://kaoja.com

学习网站:http://www.itying.com/koa

安装框架

cnpm install koa --save

简单使用

//1.引入 Koa
const koa = require('koa')
const app = new koa()

//2.配置中间件 (可以先当做路由)
app.use(async (ctx)=>{
    ctx.body = 'hello koa2'
})

//3.监听端口
app.listen(3000)


Koa 路由、get传值、动态路由

  1. koa 路由
  2. koa 路由 get 传值
  3. koa 动态路由
Koa 路由

路由:根据不同的 URL 地址,加载不同的页面,实现不同的功能

Koa 中的路由和 Express 有所不同,在 Express 中直接引入 Express 就可以配置路由

Koa 中我门需要安装对应的 koa-router 路由模块来实现

cnpm install --save koa-router
// 引入 koa 模块
const Koa = require('koa')
// 引入 koa 路由
const Router = require('koa-router')

// 引入并实例化路由
const router = require('koa-router')()

// 实例化 koa
const app = new Koa()
const router = new Router()

// 配置路由  ctx --> context  (上下文) 包含了 require 和 response 等信息
router.get('/', async (ctx)=>{
    ctx.body = '首页'   //返回数据  res.send()
}).get('/news', async (ctx)=>{
    ctx.body = '新闻页'
})

// 启动路由
app.use(router.routes())
app.use(router.allowedMethods())
/** 
 *  router.allowedMethods()用在了路由匹配 router.routes()之后,
 *  所以在所有中间件最后调用,此时根据 ctx.status 设置 response 响应头
 */


// 监听端口
app.listen(3000)

get传值

// 获取 get 传值
// http://127.0.0.1:3000/news?id=123
router.get('/newsIten', async (ctx)=>{
    // 1.从 ctx 中获取 get 传值
    conaole.log(ctx.url)    // /news?id=123
    console.log(ctx.query)  // {id: '123'}  推荐
    console.log(ctx.querystring)    // id=123
    // 2.从 ctx.require 获取
    console.log(ctx.require.url)    // /news?id=123
    console.log(ctx.require.query)  // {id: '123'}
    console.log(ctx.rewuire.querystring)    // id=123
})


动态路由

// 动态传值
// /news/:aid/cid    -> 传两个值
router.get('/news/:aid',(ctx)=>{
    // http://12
    // 获取传值
    console.log(ctx.params)     //  {aid:'123'}
})


koa 中间件

  1. 什么是 Koa 的中间件
  2. Koa 应用可使用如下几种中间件
  3. Koa 中间件的执行顺序

什么是 Koa 的中间件

通俗的讲:中间件就是匹配路由之前或者匹配路由完成做的一系列操作,我们就可以把它叫做中间件

中间件的功能包括:

  1. 执行任何代码
  2. 修改请求和响应对象
  3. 终结请求 - 响应循环
  4. 调用堆栈中的下一个中间件

Koa 应用可使用如下几种中间件

  1. 应用级中间件
  2. 路由级中间件
  3. 错误处理中间件
  4. 第三方中间件
应用级中间件
// 匹配任何路由
app.use( async (ctx,next)=>{
    console.log("这是一个中间件")
    await next()  // 继续向下匹配
})
路由级中间件
// 匹配到 news 路由以后继续向下匹配路由
router.get('/news', async (ctx,next)=>{
    console.log("这是一个新闻路由中间件")
    await next()
})

router.get('/news', async (ctx)=>{
    ctx.body = "这是一个新闻页面"
})
错误处理中间件
// www.baidu.com/xxx
app.uses( async (ctx,next)=>{
    console.log('这是一个错误处理中间件')
    await next()   --> 执行完该语句, 寻找对应路由执行
    
    if(ctx.status == 404){
        /** 没有找到页面 */
        ctx.status = 404
        ctx.body = '这是一个404页面'
    }else{
        console.log(ctx.url)
    }
})

Koa ejs 模板引擎

  1. 安装 koa-views 和 ejs
// 安装 koa-views
cnpm install koa-views --save
// 安装 ejs
cnpm install ejs --save
  1. 引入 koa-views 配置中间件 ---> 第三方中间件
const views = require('koa-views')

//app.use(views('views',{map:{html:'ejs'}}))   --> 后缀名 .html
app.use(views('views',{
    // 应用 ejs 模板引擎
    extension:'ejs'                 //  --> 后缀名 .ejs
}))
  1. 渲染模板引擎
router.get('/', async (ctx)=>{
    await ctx.render('index',{})
})

// 在 ejs 中引入模块
<%- include("./public/head.ejs") %>
    
// 在路由的每个 render 里面都要渲染一个公共的数据
    // 所有的 ejs 都能用该数据
ctx.state = {       // 放在中间件里
    session:this.session,
    title:'app'
}

app.use( async (ctx,next)=>{
    ctx.state.userInfo = "张三"
    await next()
})

koa post 提交数据 koa-bodyparser 中间件的使用

  1. 原生 Nodejs 获取 post 提交数据
  2. koa 中 koa-body-parser 中间件的使用
原生 Nodejs 获取 post 提交数据
const parsePostData = (ctx)=>{
    return new promise((resolve,reject)=>{
        try{
            let postdata = ''
            ctx.req.on('data',(data)=>{
                postdata += data
             })
            ctx.req.on('end',()=>{
                resolve(postdata)
            })
        }.catch(error){
            reject(error)
        }
    })
}

koa 中 koa-body-parser 中间件的使用
  1. 安装 koa-bodyparser

    cnpm install koa-bodyparser --save
    
  1. 安装 引入配置中间件

    const app = require('koa')()
    const bodyParser = rewuire('koa-bodyparser')
    // 配置中间件
    app.use(bodyParser())
    
    app.use( async ctx=>{
        ctx.body = ctx.request.body //{username:"lisi"}
    })
    

koa-static 静态资源中间件

  1. 安装 koa-static

    cnpm install koa-static --save
    
  1. 引入配置中间件

    const static = require('koa-static')
    
    // 配置中间件  --> 可以配置多个
    app.use(static(__dirname + './static')) // 在 static 目录下查找
    // http://127.0.0.1:3000/css/base.css
    // 首先去 static 目录找, 如果能找到返回对应文件,找不到 next()
    

koa art-template 模板引擎

  1. 常见模板引擎的性能对比
  2. 在 Koa 中使用 art-template 模板引擎
  3. art-template 模板引擎语法
常见模板引擎的性能对比

适用于 koa 的模板引擎选择非常多,比如 jade、ejs、nunjucks、art-template等

art-template 是一个简约、超快的模板引擎

它采用作用域预声明的技术来优化模板渲染速度,从而获得接近 javaScript 极限的运行性能,并且同时支持 nodejs 和浏览器

art-template 智齿 ejs 的语法,也可以用自己的类似 angular 的数据绑定的语法

官网:http://aui.github.io/art-template/

中文文档:http://aui.github.io/art-template/zh-cn/docs

在 Koa 中使用 art-template 模板引擎
  1. 安装

    cnpm install art-template --save
    cnpm install koa-art-template --save
    
  1. 引入、配置

    const render = require('koa-art-template')
    
    render(app,{
        root:path.join(__dirname,'views'),     //位置
        extname:'.html',           //后缀名
        debug:process.env.NODE_ENV !== 'production'        // 是否开启调试模式
    })
    
  1. 使用

    app.use(async (ctx)=>{
        await ctx.render('user')
    })
    
art-template 模板引擎语法

文档:http://aui.github.io/art-template/zh-cn/docs/syntax.html


Koa 中 Cookie 的使用

Cookie 简介

cookie是存储于访问者的计算机中的变量,可以让我们用一个浏览器访问同一个域名的时候共享数据。

具体功能

  1. 保存用户信息
  2. 浏览器历史记录
  3. 猜你喜欢的功能
  4. 10 天免登陆
  5. 多个页面之间的数据传到
  6. 实现购物车的功能
使用Cookie
  1. Koa 中设置 Cookie 的值

    ctx.cookies.set(name,value,[options])
    
  1. 通过 options 设置 cookie name 的 value
options 名称 options 值
maxAge 一个数字表示从 Date.now() 得到的毫秒数
expires cookie 过期的Date
path cookie 路径,默认是 '/'
domain cookie域名
secure 安全 cookie ,默认 false,设置成 true 表示只有 https 可以访问
httpOnly 是否只是服务器可访问 cookie,默认是true
overwrite 是否覆盖
  1. Koa 中获取 Cookie 的值

    ctx.cookies.get('name')
    
ctx.cookies.set('key','value',{
    maxAge:1000*60*60
})
// 另外的路由
let userInfo = ctx.cookies.get('key')

// koa 中没法直接设置中文的 cookie
let userinfo = new Buffer("张三").toString('base64')
let user = new Buffer(userinfo,'base64').toString()

Koa Session 的使用

  1. Session 简单介绍
  2. Session 的工作流程
  3. koa-session 的使用
  4. Cookie 和 Session 区别
Session 简单介绍

session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,

而 session 保存在服务器上。session 比 cookie更安全一些

Session 的工作流程

当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一个类似于 key,value 的键值对;然后将 key(cookie) 返回到浏览器(客户)端,浏览器下次再访问时,携带key(cookie),找到对应的 session (value),客户的信息都保存在 session 中

koa-session 的使用
  1. 安装 express-session

    npm install koa-session --save
    
  1. 引入 express-session

    const session = require('koa-session')
    
  1. 配置 session 中间件

    app.keys = ['some secret hurr']        // cookie 的签名
    const CONFIG = {
        key:'koa:sess',        // 默认
        maxAge:86400000,       // 过期时间
        overwrite:true,        //默认
        httpOnly:true,     // true 表示只有服务器端可以获取 cookie
        signed:true,       // 默认
        rolling:false      // 在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认 false)
        renew:true
    }
    
    app.use(session(CONFIG,app))
    
  1. 使用

    // 一个路由中 设置session
    ctx.session.userinfo = "张三"
    
    // 另一个路由 获取session
    console.log(ctx.session.userinfo)
    
END

相关文章

  • koa2.x学习1

    Koa2.x学习 开发思路和 express 差不多,最大的特点就是可以避免异步嵌套 官网:http://kaoj...

  • koa2.x学习2

    封装 Koa 操作 Mongodb 数据库的 DB 类库 官方文档:http://mongodb.github.i...

  • koa2.x学习3

    Koa 应用生成器以及 Koa 路由模块化 Koa 应用生成器Koa 搭建模块化路由/层级路由 Koa 应用生成器...

  • node读源码系列---koa2源码分析

    koa介绍 koa有1.x和2.x两个版本,koa1.x基于generator,依赖co的包装。koa2.x基于p...

  • Koa基础

    Koa2.x 四大对象 路由 参数传递 中间件 POST 静态服务 模板引擎 koa与ejs art-templa...

  • 4.2 koa源码浅析

    本节将带着大家简单看一下koa2.x最新版本的源码。 源码结构 在上一章我们已经分享了查看依赖库源码的方法,本节我...

  • 基于koa2.x实现静态资源服务器

    详细很多人都看过阮一峰的 koa框架教程 , 非常通俗易懂的入门教程,但对于koa 框架的一些内部原理,特别是中间...

  • 学习1

    吸引观众最简单的方法就是让他们知道在限定的时间限定的地点某人必须尝试某事,而如果失败,就会招致杀身之祸。——哈里·霍尼迪

  • 学习1

    今天下午是我过得最有意义的一个下午,我在阅览室做了两个钟头的题,并且了解广告年鉴。 哈哈,以后我想每天都这样过。

  • 学习1

    1.保护工作簿:不能增加或者删除新的工作表(审阅)2.保护工作表:可以选择设置某一特定的工作表用户可以进行的操作(...

网友评论

      本文标题:koa2.x学习1

      本文链接:https://www.haomeiwen.com/subject/wvmjcktx.html