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
- 安装 koa-views:
npm install --save koa-views
- 安装 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