node koa使用

154 阅读1分钟

koa的由来

  • 传统的http 使用复杂繁琐,需要指定code,res.end()写法不直观
  • koa:算是吸收了express优点,更加优雅,简洁,轻量级,增强错误处理

版本

  • koa1 是基于co 管理 Promise/Generator实现
  • koa2全部改成promise风格配合async使用

1.中间件使用next

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

//洋葱圈执行 只有调用next才会往下执行
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启动成功")
})
//aa
//bb
//cc
//33
//22
//11

如果不使用next,下面定义的use不能正常执行

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

//洋葱圈执行 只有调用next才会往下执行
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启动成功")
})
//结果
//aa
//11

日志实现

//计算中间执行的时间
app.use((ctx,next) => { 
    ctx.body = "请求结束11" //该输出必须等待下面的next调用结束后执行
    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 后续没有输出,则以这个为最终输出 
}) 

不同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)
   }
})