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)