koa包教不包会

a 夏天 提交于 2020-02-22 20:50:01

koa 基础教学

课程包教不包会 有任何问题可以联系本人。本人微信公众号"前端攻城狮"

本人邮箱yq979292@163.com

1安装 npm i koa-router -S

  • 路由嵌套
const koa = require('koa');
const app = new koa();
// Router 实例化路由对象
const Router = require('koa-router');

var router = new Router()
router.get('/',async function(ctx){
    ctx.body = 'koa is ok '
})
// 实例化子路由;
var userRouter = new Router();
   userRouter.get('/',function(ctx){
       ctx.body = 'user 路由'
   })
//  实例化3级路由;
    var adimin = new Router()
    adimin.get('/',function(ctx){
        ctx.body = '三级路由的内容ADMIN'
    })
    var compony = new Router()
    compony.get('/',function(ctx){
        ctx.body = '三级路由的内容COMPUNEY'
    })
userRouter.use('/admin',adimin.routes());
userRouter.use('/compony',compony.routes());  

var newsRouter = new Router();
newsRouter.get('/',function(ctx){
    ctx.body = 'news 路由'
})
var cartRouter= new Router();
cartRouter.get('/',function(ctx){
    ctx.body = 'catr 路由'
})

// 将二级路由挂到一级路由上
router.use('/user',userRouter.routes());
router.use('/news',newsRouter.routes());
router.use('/carts',cartRouter.routes());



// 将路由中间件挂大应用中间件上
app.use(router.routes());

app.listen(3000)
  • 路由传参数
// /:id 路由参数
router.get('/user/:id/:age/:name',async function(ctx,next){
    // ctx.params 获取 /:id 路由参数
    console.log(ctx.params);//{id:123}
})

// /user?id=123

// 路由参数
router.get('/a',async function(ctx){
    // /a?id=xx&a=xxx  参数的循序比较灵活
    console.log(ctx.query);
    let {age,id,name} = ctx.query;
    console.log(age,id,name);
    
})
  • 相同路由地址 请求方式;就近原则
  • Next
router.get('/user',async function(ctx,next){
    console.log('11111');
    // 相同的接口 走完第一个不会走第二个。
    ctx.body = '第一个/user';
    await next() // 第一个执行完毕后执行下一个 async 函数
})


// 路由参数
router.get('/user',async function(ctx){
   console.log('222222');
   
    ctx.body += '第二个user '
    
})

  • 错误处理
// 路由参数
router.get('/user',async function(ctx){   
    let {name,age} = ctx.query;
    if(name==''||age==''){
        // ctx.throw(405,msg) 给客户端看的错误提示信息
        ctx.throw(405,'parm cannot kong')
    }else if(name==undefined||age==undefined){
        ctx.throw(405,'parms cannot undefined')
    }else{
        ctx.body = '成功了'
    }
})
  • Asset 方式处理异常
// 路由参数
router.get('/user',async function(ctx){
    console.log(ctx.query);
    // ctx.assert(条件,code,msg)
    ctx.assert(ctx.query.name,400,'name is  required');
    ctx.assert(ctx.query.age,400,'name is  required');
    if(ctx.query.name&ctx.query.age){
        ctx.body = '成功'
    }
})
  • 重定向
router.get('/',async function(ctx){
    
    ctx.redirect('/user');
})

  • Koa 加载静态资源
// 处理静态资源
var static = require('koa-static');
// static() 参一:静态资源目录 参二是静态资源的配置项信息
app.use(static('static',{
    maxage:1000*60*60, // 设置文件缓存时间,文件发给客户端后;客户端保存文件的时间
    index:'1.html'// 当用户输入Localhost:3000 默认加载的静态资源
}))
app.use(router.routes())
  • 设置静态资源在浏览器中缓存时间练习
var koa = require('koa');
var app = new koa();
var Router = require("koa-router");
var router = new Router();
var static = require('koa-static');
router.get('/add',async function(ctx){
    
})

// 设置不同文件在客户端保存的时间是不同的

var staticRouter = new Router();

staticRouter.all(/(\.jpg|\.png|\.gif)$/i,static('static',{
    maxAge:1000*60*60*5,
}))
staticRouter.all(/\.css$/i,static('static',{
    maxAge:1000*60*60*6,
}))
staticRouter.all(/\.html$/i,static('static',{
    maxAge:1000*60*60*8,
}))
staticRouter.all(/\.js$/i,static('static',{
    maxAge:1000*60*60*8,
}))
staticRouter.all('',static('static',{
    maxAge:1000*60*60*8,
    index:'1.html'
}))
app.use(router.routes())
app.use(staticRouter.routes())
app.listen(3000)
  • Koa上传文件
var koa = require('koa')
var app = new koa();
var static = require('koa-static')
// 可以解析 客户端post 的任意数据格式 koa-better-body  formidable  yarm
// koa-better-body 不能安装  
var formidable = require('koa-formidable');
var Router = require("koa-router");
var router = new Router();
var path = require('path')


router.post('/file',async function(ctx){
     console.log(ctx.request.files) // 文件独享
     console.log(ctx.request.files.file.path) // 获取文件路径
    // console.log(ctx.request);
    console.log(ctx.request.body); // 存放的是:非文件参数
    
    ctx.body = '上传成功了'
})
app.use(static('static',{
    index:"1.html"
}))
app.use(formidable({
    uploadDir:__dirname+'/static/upload',// 配置文件上传的路径
    keepExtensions:true// 保留文件后缀名
}))
app.use(router.routes());

app.listen(3000)


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!