koa学习

1 环境搭建

 1 下载koa-generator

   npm install koa-generator -g 

2   执行这个命令 koa2  my-project   生成一个my-project的项目

3  进入项目 cd my-project 

4 安装依赖  cnpm i 

5 npm start 即可

6 koa 的打包的文档

webpack打包koa项目配置解析 | 岛有刃有鱼阮小六的博客https://www.ljclucky.com/2021/webpack%E6%89%93%E5%8C%85koa%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE%E8%A7%A3%E6%9E%90.html

var Koa=require("koa")
var app=new Koa();


//配置路由



//中间件
app.use(async (ctx)=>{
    ctx.body="你好 菜鸟"
})
app.listen(3000)

4. async 异步(就是将一个函数变为异步函数) await (等待异步 执行 获取异步函数的数据  )

  需要注意的是:

1 await 只能用在异步函数中

2 异步函数必须是一个return 可以是对象  字符等  数据  await 才能得到数据  不return的话  函数也会执行 但是得不到数据了(好像是返回一个空的promise对象)

3 await  会将异步转化为同步。同时 会执行这个函数

4 async 返回的是一个promise对象 

async function getData(){
    console.log("123")
}
async function sayData(){
    let data=await getData();
    // console.log(data)
}
sayData();

路由

需要安装 (根据不同的请求地址 显示不同的内容)

npm install --save  koa-router

写了中间件(无论中间件写在哪里都会先执行  要想最后执行到路由 必须用 await next()) 这样才能执行路由

分三部分 

1 引用路由 2 配置路由 3 启动路由

var Koa=require("koa");
var Router =require("koa-router");

var app=new Koa();
var router =new Router();

// 路径   回调函数  /默认地址
router.get("/",async (ctx)=>{
    ctx.body="首页"
})
router.get("/fruit",async (ctx)=>{
    ctx.body="水果"
})
router.get("/people",async (ctx)=>{
    ctx.body="朱小明"
})




//必须启动路由
app.use(router.routes())
app.use(router.allowedMethods())  //建议写上 但不是必须

app.listen(3000)

get 传值以及获取get 传的值

// 这是代码片段 整体代码与上面的代码段 除了这里别的都一样
router.get("/people",async (ctx)=>{

 // 从ctx中读取get值  获取的是对象整个参数对象 还有一种querystring 是获取的整个字符串
 console.log(ctx.query) 
 //获取整体信息
 console.log(ctx.request)
    ctx.body="朱小明"
})

动态路由 

//动态路由  :banana 动态路由名  在网址中的值 是他的值 {banana:"apple"}
router.get("/fruit/:banana",async (ctx)=>{
    console.log(ctx.params)
    ctx.body="水果"
})



//一下传多个值
router.get("/fruit/:banana/:number",async (ctx)=>{
    console.log(ctx.params)
    ctx.body="水果"
})


//这样的需要注意 url 必须两个值都有 同时{banana:"", number:""}

中间件

匹配路由之前或者配置路由之后的一些操作(页面显示之前  比如验证你是否通过验证    页面显示之后 做的一些操作)

应用级中间件(匹配路由之前)

var Koa=require("koa");
var Router =require("koa-router");

var app=new Koa();
var router =new Router();



// 中间件
//可以写两个参数 第一个是url  第二个是回调函数 只写一个回调函数表示 匹配所有的路由 
app.use(async(ctx,next)=>{
    console.log(new Date());
    console
    await next();

})


// 路径   回调函数  /默认地址
router.get("/",async (ctx)=>{
    ctx.body="首页"
})
//动态路由  :banana 动态路由名  在网址中的值 是他的值 {banana:"apple"}
router.get("/fruit/:banana",async (ctx)=>{
    console.log(ctx.params)
    ctx.body="水果"
})


//get 传值  直接在地址栏写参数

router.get("/people",async (ctx)=>{

 // 从ctx中读取get值  获取的是对象整个参数对象 还有一种querystring 是获取的整个字符串
 console.log(ctx.query) 
 //获取整体信息
 console.log(ctx.request)
    ctx.body="朱小明"
})




//必须启动路由
app.use(router.routes())
app.use(router.allowedMethods())  //建议写上 但不是必须

app.listen(3000)

路由中间件(需要注意的是 两个路由名字一样才可以  await next() )

router.get("/people",async (ctx,next)=>{

 // 从ctx中读取get值  获取的是对象整个参数对象 还有一种querystring 是获取的整个字符串

 //获取整体信息
 console.log("111")

 await next()
})
router.get("/people",async (ctx)=>{

    // 从ctx中读取get值  获取的是对象整个参数对象 还有一种querystring 是获取的整个字符串
   
    //获取整体信息
    console.log("222")
       ctx.body="小李子"
   })

koa的中间件 永远在路由之前执行不论你写在哪里

错误处理中间件

app.use(async(ctx,next)=>{
    console.log("aaa");
    await next();
    if(ctx.status==404){
        ctx.status=404;
        ctx.body="这是一个404"
    }

})
// 就是按照顺序执行的  当访问路由(地址)的时候 先执行console  然后执行next() (路由)
// 路由执行完以后 判断是否找到  找不到执行if  找到了  先执行路由 再继续执行 next() 下面的命令

多个中间件  多个路由 顺序问题 (代码帮助理解  其实就是根据顺序执行下去  但是 中间件的next 是中间件 路由的next 是路由)

var Koa=require("koa");
var Router =require("koa-router");

var app=new Koa();
var router =new Router();



// 中间件
//可以写两个参数 第一个是url  第二个是回调函数 只写一个回调函数表示 匹配所有的路由 
app.use(async(ctx,next)=>{
    console.log("aaa");
    await next();
    if(ctx.status==404){
        ctx.status=404;
        ctx.body="这是一个404"
    }
    console.log("ff");
})
app.use(async(ctx,next)=>{
    console.log("bbb");
    await next();
    if(ctx.status==404){
        ctx.status=404;
        ctx.body="这是一个404"
    }
    console.log("ee");
})


//匹配到/之后继续向下匹配路由 
router.get("/",async (ctx,next)=>{
    console.log("继续向下")
  
        
})


router.get("/people",async (ctx,next)=>{

 // 从ctx中读取get值  获取的是对象整个参数对象 还有一种querystring 是获取的整个字符串

 //获取整体信息
 console.log("cc")

 await next()
})
router.get("/people",async (ctx)=>{

    // 从ctx中读取get值  获取的是对象整个参数对象 还有一种querystring 是获取的整个字符串
   
    //获取整体信息
  console.log("dd")
       ctx.body="小李子"
   })



//必须启动路由
app.use(router.routes())
app.use(router.allowedMethods())  //建议写上 但不是必须

app.listen(3000)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值