安装
- npm i koa
基本使用
const Koa = require('koa') const app = new Koa() app.use(ctx => { ctx.body = 'hello koa' }) app.listen(3000, () => { console.log('server is running on http://localhost:3000') })
- 导入koa并实例化,编写中间件,启动服务并监听3000端口
什么是中间件
- 在请求和响应中间的处理程序称为中间件
- 中间件是一个函数
洋葱圈模型
const Koa = require('koa') const app = new Koa() app.use((ctx, next) => { console.log(1); next() // 等待下一个中间件执行完毕后再执行 next 函数后面的代码 console.log(2) }) app.use((ctx, next) => { console.log(3); next() // 等待下一个中间件执行完毕后再执行 next 函数后面的代码 console.log(4); }) app.use(ctx => { console.log(5); ctx.body = '处理完成' }) app.listen(3000, () => { console.log('server is running on http://localhost:3000') })
- 为什么输出的结果是 1 3 5 4 2
- 当一个中间件执行 next() 则该中间件会暂停并执行下一个中间件,下一个中间件执行完毕后才会执行该中间件 next 后面的代码
ctx
- ctx 中包含了基于原生 http 请求和响应的封装
路由
- npm i koa-router
const Koa = require('koa') const Router = require('koa-router') const app = new Koa() const router = new Router() // 实例化路由对象 // 编写路由规则 router.get('/', ctx => { ctx.body = '这是主页' }) router.get('/users', (ctx) => { ctx.body = '这是用户页' }) router.post('/users', (ctx) => { ctx.body = '创建用户' }) // 注册路由中间件 app.use(router.routes()) app.listen(3000, () => { console.log('server is running on http://localhost:3000') })
- 引入路由文件
- 实例化路由对象
- 编写路由规则
- 注册路由中间件
参数处理
const Router = require('koa-router') // 创建路由实例并添加路由前缀 const router = new Router({prefix: '/users'}) // GET /users?name=zs&age=66 -- 获取query查询参数 router.get('/', (ctx) => { const query = ctx.query ctx.body = query }) // GET /users/:id --- 动态params路由参数获取 router.get('/:id', (ctx) => { const params = ctx.params ctx.body = params }) // POST /users -- 处理body参数 router.post('/', (ctx) => { const body = ctx.request.body; console.log(body); ctx.body = '创建用户' }) module.exports = router
- 处理body参数需要借助一个中间件 npm install koa-body
- 并且在注册中间件时,需要在注册路由中间件之前注册
错误处理
- 404 当请求的资源找不到或者没有通过 ctx.body 返回时,koa会自动返回404
- 手动抛出 通过 ctx.throw 抛出的
- 500 运行时错误
使用中间件来处理错误
- npm install --save koa-json-error
const Koa = require('koa') const Router = require('koa-router') const koaBody = require('koa-body') const error = require('koa-json-error') const app = new Koa() const router = new Router() // 实例化路由对象 const userRoute = require('./router/users') router.get('/', ctx => { ctx.body = '这是主页' }) // 注册 处理错误中间件 app.use(error({ format: (err) => { return {code: err.status, message: err.message, result: err.stack} }, })) app.use(koaBody()) app.use(router.routes()) app.use(userRoute.routes()) router.get('/test', (ctx) => { ctx.throw(422, '参数格式不正确') // koa-json-error中间件自动处理该错误 }) app.listen(3000, () => { console.log('server is running on http://localhost:3000') })