koa2 入门
koa2是什么
koa2基本用法
koa2进阶
一、koa2是什么
官网地址:https://koa.bootcss.com/
1.基于nodejs平台的下一代web开发框架
2.Express原班人马打造,更精简
3.Async+await处理异步
4.洋葱圈型的中间件机制
二、koa2基本用法
demo:
初始化:
mkdir koa-demo
cd koa-demo
npm init
npm install koa --save
新建server.js
const Koa = require('koa')
const app = new Koa()
app.use(async (ctx, next) => {
ctx.body = 'hello koa'
})
app.listen('3000')
启动程序:
node server.js
访问:
localhost:3000
demo代码:
ctx: 封装了request和response的上下文
Next: 下一个中间件(洋葱圈模型:每个中间件都是一个"环")
App: 启动应用
demo升级:
const Koa = require('koa')
const app = new Koa()
app.use(async(ctx, next)=>{
ctx.body = '1'
//下一个中间件
next()
ctx.body += '2'
})
app.use(async(ctx, next)=>{
ctx.body += '3'
//下一个中间件
next()
ctx.body += '4'
})
app.use(async(ctx, next)=>{
ctx.body += '5'
//下一个中间件
next()
ctx.body += '6'
})
app.listen('3000')
执行程序:
node server.js
访问:localhost:3000,输出:135642(思考下顺序!洋葱圈模型)
总结:
app.use(async(ctx, next)=>{
// app.use 这就是个中间件,next就是执行下个中间件
})
问题:
app.use(async(ctx, next)=>{
ctx.body = '1'
//下一个中间件
setTimeout(()=>{
next()
}, 2000)
ctx.body += '2'
})
-- 说明:执行结果为 12,js中的setTimeout并非阻塞的,执行1之后,会执行2,再执行setTimeout时,程序已经结束
三、async+await优雅处理异步
1.问题代码(无法完成同步)
function ajax(){
setTimeout(()=>{
console.log('你好')
}, 1000)
}
ajax()
console.log("执行结束")
执行:
node xxx.js
结果:
执行结束
你好
2.问题代码(回调地狱:可以实现一个回调成功在执行下一个回调)
function ajax(fn){
setTimeout(()=>{
console.log('你好')
fn()
}, 1000)
}
ajax(() =>{
ajax(() =>{
ajax(() =>{
console.log("执行结束3")
})
console.log("执行结束2")
})
console.log("执行结束1")
})
执行:
node xxx.js
结果:
你好
执行结束1
你好
执行结束2
你好
执行结束3
思考:
这种回调,同一层之间是同步顺序的,嵌套的的层之间执行时异步的
3.改进(promise)
function delay(word){
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve(word)
},2000)
})
}
//delay函数返回的是一个promise对象,可以有.then的链式输出方法,还有.catch的debug方法
delay('孙悟空')
.then((word)=>{
console.log(word)
return delay('猪八戒')
})
.then((word)=>{
console.log(word)
return delay('沙悟净')
})
.then((word)=>{
console.log(word)
})
4.async+await(一起使用的)优雅处理异步
function delay(word){
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve(word)
},2000)
})
}
// await是在async函数的内部使用的,即必须等待一个异步的函数结束
async function start(){
const word1 = await delay('孙悟空')
console.log(word1)
const word2 = await delay('猪八戒')
console.log(word2)
const word3 = await delay('沙悟净')
console.log(word3)
}
start()
执行结果:
孙悟空
猪八戒
沙悟净
四、koa路由实现 koa-router https://github.com/ZijianHe/koa-router
1.在客户端安装koa-router
npm install koa-router --save
2.使用示例:
const Koa = require('koa')
const Router = require('koa-router')
const app = new Koa()
const router = new Router()
// 使用koa-logger.js组件
const koaLog = require('./koa-logger')
router.get('/', (ctx, next)=>{
ctx.body ='孙悟空'
})
router.get('/zhubajie', (ctx, next)=>{
ctx.body ='猪八戒'
})
//在最外层中间件开始计算耗时
app.use(koaLog)
app.use(router.routes())
.use(router.allowedMethods())
app.listen('3000')