安装
基本使用
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 请求和响应的封装
路由
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')
})