文章目录
- 1. koa 基本使用
- 2. 参数解析
- 3. 请求路径区分
- 4. 路由
- 5 参数解析
- 5.1 params 与query解析
- 5.2 body参数与urlencoded 解析
- 5.3 form-data参数
- 6 . 文件上传
- 7. 静态服务器
- 8 响应数据
- 9 错误处理
1. koa 基本使用
- 安装
npm i koa
- koa导出的是一个类,必须用
new
关键字进行创建 - koa也是通过注册中间件来完成请求操作的
const koa = require('koa');
// 导出的类,必须用new关键字
const app = new koa()
app.listen(8000, () => {console.log('koa 服务器启动~')
})// 使用koa这里传递两个参数 cxt 与next
app.use((cxt, next) => {console.log('匹配中间')cxt.body = '使用cxt中的body返回数据'
})
2. 参数解析
- koa注册的中间件提供了两个参数:
- ctx:上下文(Context)对象;
- koa并没有像express一样,将req和res分开,而是将它们作为ctx的属性;
- ctx代表一次请求的上下文对象;
- ctx.request:获取请求对象;
- ctx.response:获取响应对象;
- next:本质上是一个dispatch,类似于之前的next;
注意点
cxt
上下文有两
个请求对象一个是request既koa本身的对象
,还有一个node 封装的请求对象:req
- 两个响应对象:
cxt.response 是koa封装的响应式对象 ,txt.res 是node封装的响应式对象
app.use((cxt, next) => {/** 注意点 两个请求对象* @description: cxt 上下文有两个请求对象一个是request既koa本身的对象,还有一个node封装的请求对象:req* @param {type} */cxt.request // cxt.req/** 响应对象 两个响应对象* @description: cxt.response 是koa封装的响应式对象* @param {type} txt.res 是node封装的响应式对象* @return: */cxt.body = '使用cxt中的body返回数据'
})
3. 请求路径区分
- koa通过创建的app对象,注册中间件只能通过use方法:
- Koa并没有提供
methods的方式来注册中间件;
- 也没有
提供path中间件来匹配路径
;
- Koa并没有提供
- 但是在开发中我们如何将路径和method分离呢?
- 方式一:
根据request自己来判断
; - 方式二:
使用第三方路由中间件
;
- 方式一:
// path
// app.use((cxt, next) => {
// if (cxt.path === '/users') {
// } else if (cxt.path === '/login') {
// cxt.body = '登录成功'
// } else { }
// })// method
app.use((cxt, next) => {if (cxt.method === 'POST') {cxt.body = '登录成功'} else { }
})
4. 路由
- 安装
npm install @koa/router
const koa = require('koa');
const router = require('@koa/router')const app = new koa()
// 1. 安装路由使用 npm i @koa/routerconst userRouter = new router({ prefix: '/users' })
//2. 注册路由中间件
userRouter.get('/', (cxt, next) => {cxt.body = '路由使用'
})userRouter.get('/:id', (cxt, next) => {const id = cxt.params.idconsole.log(id);cxt.body=id
})// 3. 路由生效
app.use(userRouter.routes())
// allowedMethods路径或者方法匹配配置
app.use(userRouter.allowedMethods())
app.listen(8000, () => {console.log('koa 服务器启动~')
})
注意:allowedMethods用于判断某一个method是否支持:某个请求或者路径是否正确
5 参数解析
- get params方式 例子
:/:id
- get query方式 例子:
?name=admin&age=18
- post json方式 例子
{name:"admin" pass:123456}
- post x-www-form-urlencoded
- post form-data
注意点
下面路由统一注册为users
const userRouter = new router({ prefix: '/users' })
5.1 params 与query解析
- params参数 cxt.params.id
- query参数 cxt.query
userRouter.get('/:id', (cxt, next) => {const id = cxt.params.idcxt.body = id})userRouter.get('/', (cxt, next) => {const query = cxt.querycxt.body = query})
5.2 body参数与urlencoded 解析
- 安装依赖:
npm install koa-bodyparser;
- 使用与注册 koa-bodyparser的中间件;
app.use(bodyparser())
// 3. post/json body参数
// 安装库 npm install koa - bodyparser
// app.use(bodyparser())
// userRouter.post('/', (cxt, next) => {
// const body= cxt.request.body
// cxt.body=body
// })// 4. urlencoded
app.use(bodyparser())
userRouter.post('/', (cxt, next) => {const body = cxt.request.bodycxt.body = body
})
5.3 form-data参数
- 解析body中的数据,需要使用multer
- 安装依赖:
npm install koa-multer;
const upload =multer({})
app.use(upload.any())
app.use((cxt,next)=>{console.log(cxt.req.body);
})
6 . 文件上传
具体配置参考
const koa = require('koa');
const router = require('@koa/router')const multer = require('@koa/multer')
const app = new koa()app.listen(8000, () => {console.log('koa 服务器启动~')
})const userRouter = new router({ prefix: '/users' })
/*** 5. post form-data
*/
let storage = multer.diskStorage({destination: (req, file, cb) => {cb(null, './uploads/')},filename: (ctx, file, cb) => {cb(null, file.originalname);}
});const upload = multer({storage
})userRouter.post('/', upload.single('file'), (cxt, next) => {})
// 5. form-data 解析 需要使用multer
app.use(userRouter.routes())
7. 静态服务器
- koa并没有内置部署相关的功能,所以需要使用第三方库:
- 安装依赖
npm install koa-static
const static=require("koa-static")
const app = new koa()
app.use(static('./upload'))
8 响应数据
- 响应结果:body将响应主体设置为以下之一:
string :
字符串数据Buffer
:Buffer数据Stream
:流数据Object|| Array:
对象或者数组null :
不输出任何内容- 如果
response.status尚未设置,Koa会自动将状态设置为200或204
。
const userRouter = new router({ prefix: '/users' })
userRouter.post('/', (cxt, next) => {// 1.buffer 响应数据// cxt.body=Buffer.from('hello node')// 2. 文件流// const readerStream = fs.createReadStream('./upload/th5TYWK266.jpg')// cxt.type = 'image/jpeg' // 请求展示图片// cxt.body = readerStream// 3.响应数组或者对象类型cxt.body={name:'admin',password:123456}
})
9 错误处理
- 在做错误处理统一封装时:
cxt上下文可以触发一个emit事件
- 因此可以使用
app.on
进行监听事件
const koa = require('koa');
const router = require('@koa/router')
const app = new koa()
app.listen(8000, () => {console.log('koa 服务器启动~')
})
const userRouter = new router({ prefix: '/users' })userRouter.get('/', (cxt, next) => {const isAuth = falseif (isAuth) {cxt.body = '登录成功,返回token'} else {// cxt.body = {// code: 1001,// message: '没有进行授权'// }// 统一处理错误cxt.app.emit('errorEvent', 1001,cxt)}
})app.on('errorEvent', (code,cxt) => {let message = ''switch (code) {case 1001:message = '没有授权'breakdefault: 1002message = '成功'}const body = {code,message}cxt.body=body
})
app.use(userRouter.routes())