Koa2

本文深入探讨KOA2框架,介绍其核心特性如async/await、路由管理、中间件使用及错误处理。涵盖GET/POST请求处理、Cookie与Session操作、模板引擎集成,以及中间件执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

KOA2

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

1、async和await

async用于声明一个function是异步的,会返回一个Promise对象

await用于等待一个异步方法执行完成,可以获取异步方法里面的数据,但是必须得用在异步方法里面

2、Koa路由

定义:路由就是根据不同URL地址,加载不同的页面实现不同的功能,和express不同,express直接引入express就可以配置路由,在Koa中需要引入Koa-router路由模块来实现

案例

const Koa = require('koa')
const Router = require('koa-router')

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

//ctx(上下文context)包含了request和response等信息
 router.get('/index',async (ctx)=>{
    ctx.body = 'Hello,Wold'
}) 

//动态路由
router.get('/index/:aid',async (ctx)=>{
    let params = ctx.params
    if(params.aid == 'a'){
        ctx.body = 'aaaaa'
    }else{
        ctx.body = 'bbbb'
    }
})

app.use(router.routes())    //启动路由
   .use(router.allowedMethods)  //所有路由中间件调用后,会根据ctx.status设置response响应头

app.listen(3005)

3、获取get传值

get传值通过request接收,有两种方式:ctx.query和ctx.querystring

query:返回的是格式化好的参数对象 格式:{ name: ‘zs’, age: ‘12’ }

querystring:返回的是请求字符串 格式:name=zs&age=12

4、获取post请求参数

对于POST请求的处理,koa2没有封装获取参数的方法,需要通过解析上下文context中的原生node.js请求对象req,将POST表单数据解析成querystring(例如:a=1&b=2&c=3),再将querystring 解析成JSON格式(例如:{“a”:“1”, “b”:“2”, “c”:“3”)

对于POST请求的处理,使用koa-bodyparser中间件可以把koa2上下文的formData数据解析到ctx.request.body中,通过ctx.request.body 获取post提交的数据

5、Koa中间件

**定义:**中间件就是匹配路由之前或者匹配路由完成做的一系列的操作,如果我的get、post回调函数中,没有next参数,那么就匹配上第一个路由,就不会往下匹配了。如果想往下匹配的话,那么需要写next()

中间件种类

  1. 应用级中间件
  2. 路由级中间件
  3. 错误处理中间件
  4. 第三方中间件

1.应用级中间件

/**
* 在匹配路由之前都要打印日期(或者在匹配登录路由之前要进行权限判断)
*/
const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router();

app.use(async (ctx,next)=>{
	console.log(new Date());
	await next();
})
router.get('/', function (ctx, next) {
	ctx.body="Hello koa";
})

app.use(router.routes()); //作用:启动路由
app.use(router.allowedMethods()); //作用: 当请求出错时的处理逻辑
app.listen(3000,()=>{
	console.log('starting at port 3000');
});

2、路由中间件

router.get('/', async(ctx, next)=>{
	console.log(1)
	next()
})
router.get('/', function (ctx) {
	ctx.body="Hello koa";
})

3、错误处理中间件

app.use(async (ctx,next)=> {
	next();
	if(ctx.status==404){
	ctx.status = 404;
	ctx.body="这是一个404页面"
}
});

4、第三方中间件

const static = require('koa-static'); 
	const staticPath = './static'; 
	app.use(static(
	path.join( __dirname, staticPath)
)) 

const bodyParser = require('koa-bodyparser');
app.use(bodyParser());

6、Koa中间件的执行顺序

Koa 选择了洋葱圈模型(从外到内,再从内到外执行)

案例

const Koa = require('koa')
const Router = require('koa-router')

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

app.use(async (ctx,next)=>{
    console.log('1、这是第一个中间件');
    await next()
    console.log('5、匹配路由完成以后返回来执行中间件')  
} )
app.use(async (ctx,next)=>{
    console.log('2、这是第二个中间件');
    await next()
    console.log('4、匹配路由完成以后返回来执行中间件')  
} )
router.get('/login',async (ctx)=>{
    console.log('3、匹配到news路由')
    ctx.body = '这是一个登录页面'
})

app.use(router.routes())    //启动路由
   .use(router.allowedMethods)  //所有路由中间件调用后,会根据ctx.status设置response响应头

app.listen(3005)

执行结果

1、这是第一个中间件
2、这是第二个中间件
3、匹配到news路由
4、匹配路由完成以后返回来执行中间件
5、匹配路由完成以后返回来执行中间件

7、Koa2中 Cookie的使用

1、Koa中设置Cookie的值

ctx.cookies.set(name, value, [options])

options 名称 options 值

maxAge           多少毫秒数过期
expires 	     过期的 Date
path 	       	 路径, 默认是'/'
domain 		     域名
secure           安全 cookie   默认false,设置成true表示只有 https可以访问
httpOnly         是否只是服务器可访问 cookie, 默认是 true

2、Koa中获取Cookie的值

ctx.cookies.get('name');

3、Koa中无法直接设置中文的cookie,可以用buffer解决

console.log(new Buffer('张三').toString('base64'));// 转换成base64字符串:aGVsbG8sIHdvcmxkIQ==
console.log(new Buffer('aGVsbG8sIHdvcmxkIQ==', 'base64').toString());// 还原base64字符串:张三

8、Koa2中 Session的使用

配置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));

使用

     设置值 ctx.session.username = "张三";
     获取值 ctx.session.username

9、Koa中使用art-template模板引擎

1.安装art-template 和 koa-art-template

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

2.配置Koa2中间件:

const Koa = require('koa');
const render = require('koa-art-template');
const app = new Koa();

render(app, {
  root: path.join(__dirname, 'view'),
  extname: '.html',
  debug: process.env.NODE_ENV !== 'production'
});
//渲染index.html
app.use(async function (ctx) {
  await ctx.render('index');
});

app.listen(8001);

art-template模板引擎语法

绑定数据:	{{list.name}}
条件:	   	{{if num>20}}大于20{{else}}小于20{{/if}}
循环数据:
	{{each list.data}}
	   {{$index}}---{{$value}}
	{{/each}}
引入模板:	{{include 'public/footer.html'}}

10、Koa中使用ejs模板引擎

1、安装 koa-views 和ejs

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

2、引入koa-views配置中间件

const views = require('koa-views');
app.use(views('views', { map: {html: 'ejs' }}));  

3、Koa中使用ejs:

router.get('/add',async (ctx)=>{
    let title = 'hello koa2'
    await ctx.render(index',{
        title
    })  
})

4、ejs语法

Ejs引入模板: <%- include header.ejs %>
Ejs绑定数据: <%=h%>
Ejs绑定html数据: <%-h%>
Ejs模板判断语句

​ <% if(true){ %>
​ true
​ <%} else{ %>
​ false
​ <%} %>
Ejs模板中循环数据

​ <%for(var i=0;i<list.length;i++){%>
​ <%=list[i] %>
​ <%}%>

### Koa2 安装与使用指南 #### 一、简介 Koa 是由 Express 原班人马打造的更小、更富有表现力、更加健壮的 Web 框架。它消除了回调函数地狱并显著减少了错误处理代码的数量,通过利用 ES6 的 async 函数提供了一种更优雅的方式来编写服务器端应用程序[^1]。 #### 二、安装 要开始使用 Koa2,在命令行中执行如下 npm 命令来全局或者本地安装 koa 库: ```bash npm install --save koa@next ``` 注意这里 `--save` 参数会自动保存依赖到 package.json 文件里;而 `@next` 则指定了获取最新版本的 Koa2 而不是稳定版的 Koa1。 #### 三、创建第一个应用实例 下面是一个简单的 Hello World 实例演示如何快速搭建起基于 Koa2 的 web server: ```javascript const Koa = require('koa'); const app = new Koa(); app.use(async ctx => { ctx.body = 'Hello, world!'; }); // listen on port 3000 app.listen(3000); console.log('Server running at http://localhost:3000/'); ``` 这段代码定义了一个异步中间件函数,并将其注册给 Koa 应用程序对象 `app`. 当接收到请求时就会调用该匿名箭头函数中的逻辑返回响应体 "Hello, world!" 给客户端. #### 四、中间件机制 Koa 中间件采用洋葱模型设计模式实现,即每个中间件都可以访问上下文 (Context),并且可以决定是否继续传递控制权给下一个中间件。这种灵活的设计使得开发者能够轻松构建复杂的应用功能链路。 例如可以通过引入第三方库如 koa-router 来增强路由管理能力,也可以借助于 koa-bodyparser 解析 JSON 请求数据等[^4]: ```javascript const bodyParser = require('koa-bodyparser'); app.use(bodyParser()); ``` 上述例子展示了怎样集成 body-parser 进行 POST 数据解析操作。 #### 五、错误处理 对于生产环境下的异常情况捕获非常重要。可以在最外层添加 try-catch 结构包裹整个业务流程,亦或是专门设置 error event listener 处理未被捕获的 promise rejection 错误事件。 ```javascript app.on('error', err => { console.error('server error:', err); }); ``` 此段脚本用于监听来自内部发生的任何致命级别的 runtime errors 并记录日志信息以便后续排查问题所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值