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