koa框架

一,创建

1. 依赖

  • koa
  • nodemon
  • koa-router
  • koa-parser:解析json(body)参数
  • koa-multer:解析文件
  • koa-static:部署静态服务器

ctx.request.url:请求地址

ctx.request.query:请求参数

ctx.request.path:路径

ctx.request.body:请求的json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 返回类
const Koa = require('koa')
// 创建koa实例
const app = new Koa()

// 中间件类似什么?
// 通过use()方法注册中间件,本质上是一种回调函数
// ctx代表依次请求的上下文对象 next执行下一个中间件
// ctx.request:获取请求对象 ctx.response:获取响应对象;
app.use((ctx, next) => {
console.log('中间件被执行');
// 响应请求的内容(body的类型可以是很多种)
ctx.response.body = "hello"
})

// 监听8000端口
app.listen(8000, () => {
console.log('服务器启动成功');
})

2. 路由

开发中,将各个模块的路由文件放入router文件夹中,每个路由模块js都有自己的地址。一级一级往下走

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
---服务器---
const Koa = require('koa')
const app = new Koa()
const userRouter = require('./router/user.router')

app.use(userRouter.routes())
// 提示“访问方法不允许”
app.use(userRouter.allowedMethods())

app.listen(8000, () => {
console.log('服务器启动成功');
})


---userRouter---
const Router = require('koa-router')

// prefix:前缀
const router = new Router({ prefix: "/users" })

// 配置了prefix,写个'/'就可以了,类似baseURL
router.put('/', (ctx, next) => {
ctx.response.body = "put request"
})
router.get('/', (ctx, next) => {
ctx.response.body = "get request"
})

module.exports = router

3. 参数解析

五种接收方式:

  1. params: /user/abc 直接带上参数
  2. query: /user/abc?name=lj&age=23
  3. json: body是json格式
  4. urlencoded:body是x-www-form-urlencoded格式
  5. form-data:body是form-data格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const router = new Router({ prefix: "/users" })
router.get('/:id', (ctx, next) => {
// 假设路径为/users/abc params就是abc
console.log(ctx.request.params);
console.log(ctx.request.query);
})

// 解析json和urlencoded参数 使用koa-bodyParser库
const bodyParser = require('koa-bodyparser')
app.use(bodyParser())
router.post('/', (ctx, next) => {
console.log(ctx.request.body);
ctx.response.body = "hello"
})

4. 文件上传

multer的信息都在原生的req中,不在ctx.request中

自定义文件名和后缀名,后期学习?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const Koa = require('koa')
const bodyParser = require('koa-bodyparser')
const uploadRouter = require('./router/upload.router')
const app = new Koa()
app.use(bodyParser())
app.use(uploadRouter.routes())
app.use(uploadRouter.allowedMethods())
app.listen(8000, () => {
console.log('服务器启动成功');
})


const Router = require('koa-router')
const multer = require('koa-multer')
const router = new Router({ prefix: "/upload" })
// 文件存储位置
const upload = multer({
dest: './uploads'
})
// 上传单张图片,键名为avatar
router.post('/avatar', upload.single('avatar'), (ctx, next) => {
console.log(ctx.req.file);
ctx.response.body = "上传头像成功"
})
module.exports = router

image-20211003091820791

5. 数据的响应

ctx.response.status 简写 ctx.status

ctx.response.body 简写 ctx.body

image-20211003092434160

6. 静态服务器

koa并没有内置部署相关的功能,所以我们需要使用第三方库koa-static

image-20211003100001432

7. 错误处理方式

image-20211003150804162

二,koa源码

1. 源码

2. 对比express

3. 洋葱模型