Koa2-学习笔记

Koa2中文文档 https://demopark.github.io/koa-docs-Zh-CN/
Koa2中文文档 https://koa.bootcss.com/
Koa2中文文档(GitHub) https://github.com/demopark/koa-docs-Zh-CN

Koa相比较于express,显得更加轻量,因为许多中间件是以第三方包的形式存在的,并没有整合到Koa核心包中,如路由,静态服务器,模板引擎加载器等;而且采用的js语法更加先进,异步模式不是express里的回调,而是async,await的模式

Koa和Express对比 https://github.com/demopark/koa-docs-Zh-CN/blob/master/koa-vs-express.md

一,Hello World

const Koa = require('koa');
const app = new Koa();

app.use(async (ctx) => {
   
  ctx.body = 'hello world'
})

app.listen(8000)

二,中间件

1,什么是中间件

我的理解是,中间件就像MVC模式里的C那样(控制路由),而且功能更加全面,每个中间件都有能力接受请求,和响应请求,处理请求数据(几乎可以作任何事),也可以把这次请求传递给下一个中间件,直到一个中间件做出回应而结束请求过程

2,Koa中间件模型

下图这个是Koa的中间件洋葱模型,也就是请求从第一个中间开始,一直传递给下一个中间件直到有一个中间件做出响应结束了请求过程,但是之后会依次从刚刚做出响应的中间件开始依次原路返回执行中间件在使用next函数后的代码。

这个模型让我想到了事件响应的捕获和冒泡机制,也是洋葱模型

3,与express中间件模型对比

和express一样,koa也是中间件驱动框架,中间件就是核心。但是koa的中间件处理后,做出响应的过程会有一个“原路返回”的过程,而express中间件整体是一个 “环形” 的过程,如下图:

4,代码实现

中间件可以用多个app.use()来连接,如:

const Koa = require('koa')

const app = new Koa()

app.use(async (ctx,next) => {
   
  console.log(1)
  await next()
  console.log(2)
  ctx.body = 'hello world'
})

app.use(async (ctx,next) => {
   
  console.log(3)
  await next()
  console.log(4)
})

app.use(async (ctx) => {
   
  console.log(5)
})

app.listen(3000, () => {
   
  console.log('listening on 3000 port......')
})

// 打印顺序为: 1 3 5 4 2 

也可以用类似于promise

app
	.use(router.routes())
	.use(router.allowedMethods())

好像也可以用一个app.use()

这个感觉上可以,但是好像不可以

app.use(router.routes(), router.allowedMethods())

三,静态服务器

需要第三方包koa-static,使用npm install koa-static下载

const Koa = require('koa');
const static = require('koa-static');
const app = new Koa();

// 以当前目录下的www为静态文件目录
app.use(static('./www'));

app.listen(8000)

四,路由

需要第三方包koa-router,使用npm install koa-router下载

1,基本
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router();

// 配置路由
router.get('/', async (ctx) => {
   
  ctx.body = 'home';
})

// 启用路由
app
  .use(router.routes())
  .use(router.allowedMethods())

app.listen(8000, ()=>{
   
  console.log('running...');
});
2,prefix

prefix以下的路由都需要加www前缀

// .......
router.prefix('/www')
router.get(/*......*/)
// .......

实例化路由时,加上prefix

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

const userRouter = new Router({
    prefix
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值