koa是web应用框架,是Express原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架

个人推荐:个人开发推荐用koa,团队开发推荐用egg

egg是在koa的基础上进行封装,并且提供了一些,并且添加了约束,更利于工程化的开发

安装koa

npm install koa

新建一个app.js

const Koa = require("koa")
const app = new Koa()
app.use(async (ctx, next) => {
    await next()
    ctx.response.type = 'text/html'
    ctx.response.body = '<h1>hallo, koa!</h1>'
})
app.listen(3000)

node app.js

get请求参数的接收

const Koa = require('koa')
const app = new Koa()
app.use(async(ctx)=>{
    const url =ctx.url
    const request =ctx.request
    const reqQuery = request.query
    const reqQuerystring = request.querystring
    ctx.body={
        url,
        reqQuery,
        reqQuerystring
    }
})
app.listen(3000,()=>{
    console.log('port 3000')
})

http://127.0.0.1:3000/admin?name=admin&pass=123

通过ctx.request来获取得到get请求参数(query)

还可以通过ctx上下文获取

app.use(async(ctx)=>{
    const url =ctx.url
    const ctxQuery = ctx.query
    const ctxQuerystring = ctx.querystring
    ctx.body={
        url,
        ctxQuery,
        ctxQuerystring
    }
})

Post请求接收

Koa默认返回类型是text/plain,判断返回类型ctx.request.accepts()

一般来说,返回给用户的页面都是写成文件的,因此可以通过nodejs的fs来读取本地的文件

const fs = require("fs")
app.use(async (ctx, next) => {
    await next()
    ctx.response.type = 'text/html'
    ctx.response.body = 'fs.createReadStream('./test.html')'
})

路由

判断当前路由地址

ctx.request.path

路由模块

const route = require(‘koa-route’)

app.ues(route.get("/", main))

静态资源管理

const path = require(‘path’) const serve = require(‘koa-static’) const main = serve(path.join(__dirname)) app.use(main)

重定向

ctx.response.redirect()可以实现302重定向,例如:

const redirect = ctx => {
    ctx.response.redirect('/')
    ctx.response.body = '<a href="/">index</a>'
}
app.use(route.get('/auth, redirect));

中间件

中间件实质上就是在请求和响应之间,实现某个中间功能,而app.use()就是用来加载中间件的

这个中间件默认支持两个参数(ctx和next)

多个中间件,按照先进后出,next可以传递,await next就是异步中间件

合成中间件

const compose = require(‘koa-compose’) const c = compose([a, b]) app.use(c)

抛出错误

const main = ctx =>{
    ctx.response.status = 404
    ctx.response.body = '404找不到资源';
}

注意:发生错误,koa会触发一个error事件,因此也可以监听这个事件,来抛出错误

读写cookies

ctx.cookies.get()