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

posted @ 2020-05-13 09:15  雷哒哒  阅读(599)  评论(0编辑  收藏  举报