koa的由来
- 传统的http 使用复杂繁琐,需要指定code,res.end()写法不直观
- koa:算是吸收了express优点,更加优雅,简洁,轻量级,增强错误处理
版本
- koa1 是基于co 管理 Promise/Generator实现
- koa2全部改成promise风格配合async使用
1.中间件使用next
const Koa = require("koa")
const app = new Koa();
app.use((ctx,next) => {
console.log("aa")
next()
console.log("11")
})
app.use((ctx,next) => {
console.log("bb")
next()
console.log("22")
})
app.use((ctx,next) => {
console.log("cc")
next()
console.log("33")
})
app.listen(3000,()=> {
console.log("3000启动成功")
})
如果不使用next,下面定义的use不能正常执行
const Koa = require("koa")
const app = new Koa();
app.use((ctx,next) => {
console.log("aa")
console.log("11")
})
app.use((ctx,next) => {
console.log("bb")
next()
console.log("22")
})
app.use((ctx,next) => {
console.log("cc")
next()
console.log("33")
})
app.listen(3000,()=> {
console.log("3000启动成功")
})
日志实现
app.use((ctx,next) => {
ctx.body = "请求结束11"
let now = new Date().getTime()
next()
let end = new Date().getTime()
console.log("执行时间长",end - now)
})
app.use((ctx,next) => {
let experie = Date.now() + 500
while (Date.now() < experie) {
}
ctx.body = "请求结束22"
})
不同use直接数据交互
app.use((ctx,next) => {
ctx.body = [{aa:"jason"}]
next()
})
app.use((ctx,next) => {
if (ctx.url === '/html') {
ctx.type = 'text/html;charset=utf-8'
ctx.body = `<b>我的名字是:${ctx.body[0].aa}</b>`
} else {
ctx.body = "什么都没有"
}
})
2.静态服务koa-static
app.use(require("koa-static")(__dirname,"/"))
3.路由使用koa-router
const router = require("koa-router")()
router.get('/info', async (ctx,next) => {
ctx.body = {aa: "11"}
})
router.post('/save', async (ctx,next) => {
ctx.type = "text/html;"
ctx.body = "<h1>jj</h1>"
})
简单的路由实现
const router = {}
router['/info'] = ctx => {
ctx.body = {aa:"11"}
}
router['/html'] = ctx => {
ctx.type = "text/html;charset=utf-8"
ctx.body = `<h1>hello</h1>`
}
app.use((ctx,next) => {
const fun = router[ctx.url]
if (fun) {
fun(ctx)
}
})