做公众号文章的网站,招标代理公司加盟合作,宁波seo哪家最便宜,dw做的网站如何上传图片文章目录 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 koakoa导出的是一个类#xff0c;必须用new关键字… 文章目录 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 koakoa导出的是一个类必须用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中间件来匹配路径 但是在开发中我们如何将路径和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.bodyid
})// 3. 路由生效
app.use(userRouter.routes())
// allowedMethods路径或者方法匹配配置
app.use(userRouter.allowedMethods())
app.listen(8000, () {console.log(koa 服务器启动~)
})注意allowedMethods用于判断某一个method是否支持某个请求或者路径是否正确
5 参数解析
get params方式 例子:/:idget query方式 例子: ?nameadminage18post json方式 例子 {name:admin pass:123456}post x-www-form-urlencodedpost form-data
注意点 下面路由统一注册为users
const userRouter new router({ prefix: /users })5.1 params 与query解析
params参数 cxt.params.idquery参数 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.bodybody
// })// 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 staticrequire(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.bodyBuffer.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.bodybody
})
app.use(userRouter.routes())