• Node.js第十一篇:Koa框架基础


    第一章:Koa快速入门

    1.1-什么是Koa

    Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

    Koa 学习网站:https://koa.bootcss.com

    1.2-Koa和Express的区别

    Koa和Express都是NodeJS的主流应用开发框架。

    Express是一个完整的nodejs应用框架。Koa是由Express团队开发的,但是它有不同的关注点。Koa致力于核心中间件功能。nodejs中间件是访问请求对象(req)和响应对象(res)的例程。这些例程在路由处理程序之前被调用,因此它们位于客户端与生成响应的路由逻辑的“中间”。nodejs应用程序可以将中间件例程“链接”到自定义请求/响应管道中。管道可以根据请求和响应进行操作,包括头和主体。Express和Koa都包含中间件,但实现方法却截然不同。

    核心Koa模块只是中间件内核。而Express包含一个完整的应用程序框架,具有路由和模板等功能。Koa确实有这些功能的选项,但它们是单独的模块。因此,Koa的模块化程度更高;您只需包含所需的模块即可。核心KOA模块只有大约2千行代码,因此,如果您只需要核心请求应答上下文对象,则Koa占用空间非常小。相比较而言,Express较为庞大,内置了一整套中间件功能,好处是对于大部分应用场合你可以省掉自己选择和组合模块的时间。

    Koa对Express进行了扩展,并充分利用了ES7新的语法。Koa的Context对象是对Express核心请求和应答对象的扩展,另外利用async/await来消除回调(callback)陷阱。

    1.3-第一个koa框架程序

    Node.js环境

    开发 Koa2 之前,Node.js 是有要求的,它要求 Node.js 版本高于 V7.6。因为 node.js 7.6 版本 开始完全支持 async/await,所以才能完全你支持我们的 Koa2。

    安排koa

    npm install --save koa

    简单使用

    // 导入koa模块
    const koa = require('koa')
    // 创建koa服务
    const app = new koa()
    
    // 监听请求
    app.use(async (cx) => {
      cx.body = 'hello koa'
    })
    
    // 设置端口,开启监听
    app.listen(80)
    

    第二章:Koa路由模块

    2.1-概述

    路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等) 组成的,涉及到应用如何响应客户端对某个网站节点的访问。

    通俗的讲:路由就是根据不同的 URL 地址,加载不同的页面实现不同的功能。

    2.2-安装和使用路由模块

    Koa 中的路由和 Express 有所不同,在 Express 中直接引入 Express 就可以配置路由,但是在 Koa 中我们需要安装对应的 koa-router 路由模块来实现。

    npm install koa-router --save
    

    代码演示

    const koa = require('koa')
    // 【导入路由模块】
    const router = require('koa-router')()
    
    const app = new koa()
    
    
    router.use('/news', async (ctx) => {
      ctx.body = '新闻列表'
    })
    
    // 注册路由
    app.use(router.routes())
    // 作用: 这是官方文档的推荐用法,我们可以 看到 router.allowedMethods()用在了路由匹配 router.routes()之后,所以在当所有 路由中间件最后调用.此时根据 ctx.status 设置 response 响应头
    app.use(router.allowedMethods()); 
    
    
    app.listen(80)
    

    2.3-get请求和请求参数

    格式:router.get()

    获取请求参数:

    • ctx.request.query 返回对象格式
    • ctx.request.querystring 返回字符串格式
    • ctx.query 返回对象格式
    • ctx.querystring 返回字符串格式

    代码演示

    const koa = require('koa')
    const router = require('koa-router')()
    
    const app = new koa()
    
    // 【获取get请求参数】
    router.get('/news', async (ctx) => {
      const url = cx.url
      // 从request对象中获取参数
      const req_query = ctx.request.query
      const req_querystring = ctx.request.querystring
      // 从cx上下文中直接获取
      const ctx_query = ctx.query
      const ctx_querystring = ctx.querystring
    
      ctx.body = {
        url,
        req_query,
        req_querystring,
        cx_query,
        cx_querystring
      }
    })
    
    app.use(router.routes())
    app.use(router.allowedMethods());
    
    app.listen(80)
    

    2.4-post请求和请求参数

    格式

    router.post()

    原生方式获取post请求参数

    const koa = require('koa')
    const router = require('koa-router')()
    
    const app = new koa()
    
    // 封装获取post数据
    let getPostData = (ctx) => {
      return new Promise(function (resolve, reject) {
        try {
          let str = '';
          ctx.req.on('data', function (chunk) {
            str += chunk;
          })
          ctx.req.on('end', function (chunk) {
            resolve(str)
          })
    
        } catch (err) {
          reject(err)
        }
    
      })
    }
    
    // 处理post请求
    router.post('/news', async (ctx, next) => {
      const data = await getPostData(ctx);
      console.log(data);  // 输出结果:username=admin&password=123456
      ctx.body = 'ok'
    })
    
    
    app.use(router.routes())
    app.use(router.allowedMethods());
    
    app.listen(80)
    

    koa-bodyparser模块简化操作post请求数据

    安装:npm i koa-bodyparser --save

    代码:

    const koa = require('koa')
    const router = require('koa-router')()
    // 导入body-parser,简化获取post请求参数
    const bodyparser = require('koa-bodyparser')
    
    const app = new koa()
    
    // 【获取post请求参数】
    router.post('/news', async (cx) => {
      // 获取post请求参数
      const params = cx.request.body
      cx.body = {
        params
      }
    })
    // 注册body-parse
    app.use(bodyparser())
    app.use(router.routes())
    app.use(router.allowedMethods()); 
    
    app.listen(80)
    

    2.5-动态参数获取方式

    const koa = require('koa')
    const router = require('koa-router')()
    
    const app = new koa()
    
    // 【获取动态路由数据】  例如::id 就是动态参数
    router.get('/news/:id', async (cx) => {
      const params = cx.params
      cx.body = params
    })
    // 请求:http://localhost/news/1
    // 返回结果:{"id":"1"}
    
    app.use(router.routes())
    app.use(router.allowedMethods()); 
    
    
    
    app.listen(80)
    

    2.6-Koa请求错误处理

    const koa = require('koa')
    const router = require('koa-router')()
    
    const app = new koa()
    
    router.get('/news', async (ctx) => {
      ctx.body = 'ok'
    })
    
    // 请求错误处理中间件
    app.use(async (ctx, next) => {
      await next()
      if (ctx.status == 404) {
        ctx.status = 404
        ctx.body = '这个页面不存在!'
      }
    })
    
    app.use(router.routes())
    app.use(router.allowedMethods()); 
    
    
    app.listen(80)
    

    2.7-开放静态资源

    安装模块-koa-bodyparser

    npm install koa-bodyparser --save

    代码演示

    const koa = require('koa')
    const router = require('koa-router')()
    const path = require('path')
    // 导入静态资源处理模块
    const static = require('koa-static')
    
    const app = new koa()
    
    app.use(bodyparser())
    app.use(router.routes())
    app.use(router.allowedMethods()); 
    // 配置静态资源路径
    app.use(static(path.join(__dirname,'./public')))
    
    router.get('/news', async (ctx) => {
      ctx.body = 'ok'
    })
    
    app.listen(80)
    

    第三章:Koa中使用ejs模板引擎

    安装 koa-views 和 ejs

    1. 安装 koa-views: npm install --save koa-views
    2. 安装 ejs: npm install ejs --save>

    koa中配置

    服务器程序代码

    const koa = require('koa')
    const router = require('koa-router')()
    const path = require('path')
    // 导入koa-views模块
    const views = require('koa-views'); 
    
    const app = new koa()
    
    // 配置模板引擎中间件  --第三方中间件
    // views('模板路径', { map: {html: 'ejs' }}))
    //app.use(views('views', { map: {html: 'ejs' }}));   //这样配置也可以  注意如果这样配置的话 模板的后缀名是.html
    app.use(views('views',{
      extension:'ejs'  /*应用ejs模板引擎*/
    }))
    
    // 使用模板引擎
    router.get('/list', async (ctx) => {
      await ctx.render('list', {
        title: '<h1>列表页面</h1>'
      })
    })
    
    // 注意:中间件的执行是有顺序的,路由在前,然后模板引擎在后的话,当执行到ctx.render的时候,模板引擎相关的中间件还未执行,render方法还未绑定到ctx上,所以就会报ctx.render is not a function
    app.use(router.routes())
    app.use(router.allowedMethods())
    
    
    app.listen(80)
    

    模板引擎代码-list.ejs

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    
    <body>
      <!-- 导入其他ejs模板 -->
      <%-include('./header.ejs')%>
      <!-- Ejs 绑定数据 -->
      <%=title%>
      <!-- Ejs 绑定 html 数据 -->
      <%-title%>
      <!-- 判断 -->
      <%if(true){%>
        <h2>ok</h2>
      <%}%>
      <!-- 循环 -->
      <%for(var i = 0; i < 10; i++){%>
        <%=i%>
      <%}%>
      
    </body>
    </html>
    

    第四章:Koa中使用art-template

    4.1-概述

    art-template 是一个简约、超快的模板引擎。 它采用作用域预声明的技术来优化模板渲染速度,从而获得接近 JavaScript 极限的运行 性能,并且同时支持 NodeJS 和浏览器。

    4.2-安装和使用

    安装

    npm install --save art-template
    npm install --save koa-art-template
    

    使用

    服务端程序导入和配置

    const koa = require('koa')
    const router = require('koa-router')()
    const path = require('path')
    // 导入koa-art-template模块
    const render = require('koa-art-template'); 
    
    const app = new koa()
    
    // 配置模板引擎中间件  --第三方中间件
    render(app, {
      root: path.join(__dirname, 'views'),
      extname: '.art',
      debug: process.env.NODE_ENV !== 'production'
    });
    
    // 使用模板引擎
    router.get('/list', async (ctx) => {
      await ctx.render('list2', {
        title: '<h3>列表页面</h3>'
      })
    })
    
    // 注意:中间件的执行是有顺序的,路由在前,然后模板引擎在后的话,当执行到ctx.render的时候,模板引擎相关的中间件还未执行,render方法还未绑定到ctx上,所以就会报ctx.render is not a function
    app.use(router.routes())
    app.use(router.allowedMethods())
    
    app.listen(80)
    

    模板引擎代码:list2.art

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    
    <body>
      <h2>art-template模板引擎</h2>
      // 输出内容
      {{title}}
      // 输出内容(解析html)
      {{@title}}
    </body>
    </html>
    

    第五章:Koa中操作cookie

    const koa = require('koa')
    const router = require('koa-router')()
    
    const app = new koa()
    
    // 登录-设置cookie
    router.get('/login', async (ctx) => {
      ctx.cookies.set('username', 'admin', {
        maxAge:60*1000   // 有效时间
      })
      // 设置中文的值-需要转码
      ctx.cookies.set('gender',new Buffer('男').toString('base64'))
      ctx.body = 'ok'
    })
    // 首页-读取cookie
    router.get('/index2', async (ctx) => {
      const val = ctx.cookies.get('username')
      const val2 = ctx.cookies.get('gender')
      ctx.body = 'cookie:' + val + '--' + (new Buffer(val2,'base64').toString());
    })
    
    
    app.use(router.routes())
    app.use(router.allowedMethods())
    
    
    app.listen(80)
    

    第六章:Koa中操作session

    安装koa-session模块:npm install koa-session

    const koa = require('koa')
    const router = require('koa-router')()
    // 导入koa-session模块
    const session = require('koa-session')
    
    const app = new koa()
    
    // 配置session
    app.keys = ['some secret hurr'];
    const CONFIG = {
      key: 'koa:sess', //cookie key (default is koa:sess) 
      maxAge: 86400000, // cookie 的过期时间 maxAge in ms (default is 1 days) 
      overwrite: true, //是否可以 overwrite (默认 default true) 
      httpOnly: true, //cookie 是否只有服务器端可以访问 httpOnly or not (default true) 
      signed: true, //签名默认 true 
      rolling: false, //在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false) 
      renew: false, //(boolean) renew session when session is nearly expired, 
    };
    app.use(session(CONFIG, app));
    
    
    
    app.use(router.routes())
    app.use(router.allowedMethods())
    
    // 设置session
    router.get('/login', async (ctx) => {
      ctx.session.username = '张三';
      ctx.body = 'ok'
    })
    
    // 获取session
    router.get('/index3', async (ctx) => {
      ictx.body = 'username:' + ctx.session.username
    })
    
    // 销毁session
    router.get('/destroy', async (ctx) => {
      ctx.session = null
      ctx.body = 'ok'
    })
    
    
    
    app.listen(80)
    

    第七章:Koa项目基本架构

    链接:https://pan.baidu.com/s/1cK4BMDaSe59H84KY6-y5RA
    提取码:64mj

  • 相关阅读:
    elasticsearch 6.x.x 获取客户端方法
    struts2+spring 配置404和500错误页面
    linux 部署redis集群 碰到的坑
    Linux下安装redis
    struts加载spring
    有关struts中DispatchAction的用法小结
    spring AOP原理
    struts2.0的工作原理?
    Spring MVC的实现原理
    spring 的单例模式
  • 原文地址:https://www.cnblogs.com/lpl666/p/12880334.html
Copyright © 2020-2023  润新知