node-koa学习总结

安装

创建环境

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服务器启动成功");
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值