安装
创建环境
npm init -y
安装koa
npm install koa
初体验
const Koa = require('koa')
// 与express不同,koa导出的是类
const app = new Koa()
// 中间件只有两个参数, ctx上下文对象
app.use((ctx,next)=>{
ctx.body = "接口请求成功"
})
app.listen(6000,()=>{
console.log("koa服务器启动成功");
})
1.ctx参数解析
const Koa = require('koa')
const app = new Koa()
// 中间件只有两个参数, ctx上下文对象
app.use((ctx,next)=>{
ctx.request// 请求对象,koa封装的请求对象
ctx.req // 请求对象,node封装的请求对象
ctx.response // 响应对象,koa封装的响应对象
ctx.res // 响应对象,node封装的响应对象
// 3.其他属性
// 在request,response中的属性,大部分在ctx也存在,两者是一样的
ctx.request.path
ctx.path
ctx.body = "接口请求成功"
})
app.listen(6000,()=>{
console.log("koa服务器启动成功");
})
2.koa区分路径及方法
const Koa = require('koa')
const app = new Koa()
// koa没有路径及方法中间件,app.use中只能是函数
// 我们要区分不能方法及路径需要手动判断,或第三方中间件
// 后续我们使用路由解决
app.use((ctx,next)=>{
console.log(ctx.path);
if (ctx.path === '/login') {
ctx.body = "登录成功"
} else if (ctx.path === '/user') {
if (ctx.method === 'GET') {
ctx.body = "user list data"
} else if (ctx.method === 'POST') {
ctx.body = "创建用户成功"
}
}
})
app.listen(6000,()=>{
console.log("koa服务器启动成功");
})
3.koa路由的使用
koa是轻量化的,没有内置,需要单独安装
npm install @koa/router
使用
const Koa = require('koa')
const KoaRouter = require('@koa/router')
const app = new Koa()
// 1.创建路由对象,prefix前缀用于区分路径
const userRouter = new KoaRouter({prefix:'/users'})
// 2.在路由中注册中间件,区分path/method
userRouter.get('/',(ctx,next)=>{
ctx.body = '获取user lixt成功'
})
userRouter.post('/create',(ctx,next)=>{
ctx.body = '创建user成功'
})
userRouter.delete('/:id',(ctx,next)=>{
ctx.body = `删除用户成功${ctx.params.id}`
})
//3.使用路由
app.use(userRouter.routes())
// 注:当我们访问没有注册的方法时,会返回not found,提示不友好
// allowedMethods,会返回Method Not Allowed
app.use(userRouter.allowedMethods())
app.listen(6000,()=>{
console.log("koa服务器启动成功");
})
日常开发中我们都是抽离为单独文件,注意module.exports导出
4.koa参数解析
const Koa = require('koa')
const KoaRouter = require('@koa/router')
const bodyparser = require('koa-bodyparser')
const multer = require('@koa/multer')
const app = new Koa()
// 使用第三方库解析json数据
app.use(bodyparser())
// 第三方解析formdata
const formParams = multer()
const userRouter = new KoaRouter({prefix:'/users'})
// 传参常见的几种方式
// 1.get:params方式 例 users/:id
// 2.get:query方式 例 users?id=11&name=zhao
// 3.post: json方式 {"name":"zhao","age":"15"}
// 4.post: x-www-form-urlencoded
// 5.post: form-data
// 1.get:params
userRouter.delete('/:id',(ctx,next)=>{
ctx.body = `删除用户成功${ctx.params.id}`
})
// 2.get:query
userRouter.get('/',(ctx,next)=>{
console.log(ctx.query);
ctx.body = '数据查询成功'
})
//3.post: json方式
// 我们需要借助第三方库 npm install koa-bodyparser
userRouter.post('/',(ctx,next)=>{
console.log(ctx.request.body);
ctx.body = '数据创建成功'
})
// 4.post: x-www-form-urlencoded
// x-www-form-urlencoded也可以被bodyparser解析
userRouter.post('/urlencoded',(ctx,next)=>{
console.log(ctx.request.body);
ctx.body = 'urlencoded数据创建成功'
})
// 5.post: form-data
// 需要单独安装npm install @koa/multer multer
userRouter.post('/formdata',formParams.any(),(ctx,next)=>{
console.log(ctx.request.body);
ctx.body = 'formdata数据创建成功'
})
app.use(userRouter.routes())
app.use(userRouter.allowedMethods())
app.listen(6000,()=>{
console.log("koa服务器启动成功");
})
5.koa文件上传处理方案
const Koa = require('koa')
const KoaRouter = require('@koa/router')
// 1,导入
const multer = require('@koa/multer')
const app = new Koa()
// 只指定文件上传后所在文件夹
// const upload = multer({
// dest: './uploads'
// })
// 自定义文件上传名称,路径
const upload = multer({
storage: multer.diskStorage({
destination(req,file,cb) {
cb(null,'./uploads')
},
filename(req,file,cb) {
// 时间戳加原文件名
cb(null,Date.now()+'_'+file.originalname)
}
})
})
const uploadRouter = new KoaRouter({prefix:'/upload'})
// 单文件上传
uploadRouter.post('/avatar',upload.single('avatar'),(ctx,next)=>{
console.log(ctx.request.file);
ctx.body = '文件上传成功'
})
// 多文件上传
uploadRouter.post('/photos',upload.array('photos'),(ctx,next)=>{
console.log(ctx.request.files);
ctx.body = '文件上传成功'
})
app.use(uploadRouter.routes())
app.use(uploadRouter.allowedMethods())
app.listen(6000,()=>{
console.log("koa服务器启动成功");
})
6.koa部署静态资源
const Koa = require('koa')
// 安装插件 koa-static
// 导入
const static = require('koa-static')
const app = new Koa()
// 使用
// 将静态资源(图片)部署,也可以把前端项目打包后的dist文件件放进来
app.use(static('./uploads'))
app.listen(6000,()=>{
console.log("6000服务开启成功");
})
7.koa响应结果
const Koa = require('koa')
const KoaRouter = require('@koa/router')
const fs = require('fs')
const app = new Koa()
const uploadRouter = new KoaRouter({prefix:'/upload'})
uploadRouter.get('/',(ctx,next)=>{
// 1.字符串
// ctx.body = 'hahaha'
// 2.buffer
// ctx.body = Buffer.from("你好啊,大帅哥")
// 3.stream
// ctx.type = 'image/jpeg'
// ctx.body = fs.createReadStream('./uploads/1672299179542_avatar2.png')
// 4.array/object
ctx.body = {
code: 0,
data:[
{id:1,name:'zhao'},
{id:2,name:'li'}
]
}
// 5.null
// ctx.body = null
})
app.use(uploadRouter.routes())
app.use(uploadRouter.allowedMethods())
app.listen(6000,()=>{
console.log("koa服务器启动成功");
})
8.koa处理错误信息
const Koa = require('koa')
const KoaRouter = require('@koa/router')
const app = new Koa()
const uploadRouter = new KoaRouter({prefix:'/upload'})
uploadRouter.get('/',(ctx,next)=>{
// 假设这里发生了错误
if (true) {
ctx.app.emit('error',-1001,ctx)
}
})
// 日常开发中我们会抽离为单独的文件
app.on('error',(code,ctx)=>{
const errCode = code
let message = ''
switch (errCode) {
case -1001:
message = '账号密码错误'
break;
default:
break;
}
const body = {
code : errCode,
message
}
// 利用ctx参数把错误信息返回客户端
ctx.body = body
})
app.use(uploadRouter.routes())
app.use(uploadRouter.allowedMethods())
app.listen(6000,()=>{
console.log("koa服务器启动成功");
})