Koa

2022-09-14 15:05:41 浏览数 (2)

下载 cnpm i koa -D

基本使用
代码语言:javascript复制
const Koa = require('koa');
let server = new Koa();
server.listen(8080);
路由

koa本身不带路由,因此我们要引入第三方模块 cnpm i koa-router -D

基本使用

代码语言:javascript复制
const Router = require('koa-router');
//1.创建一个路由对象
let router = new Router();
//2.为该路由添加异步函数
router.get('/test',async (ctx,next)=>{
    ctx.body='hello word'
});//get路由
router.post('/test',async (ctx,next)=>{
    ctx.body='hello word'
});//post路由
router.all(async (ctx,next)=>{
    ctx.body='hello word'
});//任意请求路由
//3.将路由绑定到服务
server.use(router.routes())

路由异步函数需要两个参数其中next参数可选,当当前异步函数执行完毕后可根据需要将请求提交给下一个路由(next())处理。 如有时候我们将一个路由进行多个处理 ,当没有满足前面路由的条件时不往下执行

代码语言:javascript复制
router.get('/login',async (ctx,next)=>{
   //
   if(true){
      await next();
   }else{
     ctx.body='错误'
   }
})
//
router.get('/a',async (ctx,next)=>{
    ctx.body='欢迎登录'
})

路由嵌套 项目目录新键文件夹routers该目录存放路由文件

admin.js

代码语言:javascript复制
const Router = require('koa-router');

let router = new Router();
router.get('/',async ctx=>{
    ctx.body='管理员用户'
});
module.exports=router.routes();

company.js

代码语言:javascript复制
const Router = require('koa-router');

let router = new Router();
router.get('/',async ctx=>{
    ctx.body='企业用户'
});
module.exports=router.routes();

index.js

代码语言:javascript复制
const Router = require('koa-router');

let router = new Router();

router.get('/',ctx=>{
    ctx.body='helo'
})
router.use('/company/',require('./company'));
router.use('/admin/',require('./admin'));

module.exports = router.routes();

server.js

代码语言:javascript复制
const Koa = require('koa');
const Router = require('koa-router');

let server = new Koa();
server.listen(4000);

let router =  new Router();
router.use('/user',require('./routers/user'));
router.get('/',(ctx)=>{
    ctx.body = 'hello'
})
server.use(router.routes());

如下路由 1./ 2/user 3.user/admin 4./user/company

路由传参

代码语言:javascript复制
let router = new Router();//创建一个总路由
//路由传参
router.get('/test/:id/:name/',async ctx=>{
    ctx.body='欢迎登录'
    console.log(ctx.params);//获取get请求参数
})

ctx对象 ctx对象非常的强大包含了我们处理请求需要的各种数据以及其他方法。 常用的ctx属性/方法有

  1. ctx.method :请求方法(get/post/....)
  2. ctx.url :请求的url
  3. ctx.path:请求的路径不包含域名
  4. ctx.ip:客户端ip
  5. ctx.headers:请求头
  6. ctx.body:向客户端发送数据,相对于原生 res.write();res.end();
  7. ctx.throw(code,msg) 抛出异常 code为状态码 msg为错误信息
  8. ctx.assert(条件,code,msg) 条件为false抛出异常 相对于ctx.throw外层加了判断语句
  9. ctx.state=404 设置状态码
  10. ctx.redirect('/login') 重定向到指定路由
  11. ctx.request 相当于原生的req
  12. ctx.response 相当于原生的res
  13. ctx.query :接收get参数 以?id=34&name..格式
  14. ctx.param 接收get参数 以 /id/2/name/df..格式

除了使用ctx自带的一些属性方法外我们还可以自己添加一些属性或方法 方法

server.context相当于ctx的原型对象

在server.context中添加属性/方法即可应用到ctx如

代码语言:javascript复制
const koa = require('koa');
const Router=require('koa-router');

let server=new koa();
server.listen(8080);
server.context.testCtx='测试';//自定义一个ctx属性


let router = new Router();//创建一个总路由
router.all('*',async ctx=>{
    ctx.body=ctx.testCtx;
    //返回结果 “测试”
})

中间件 中间件用于在请求为到达服务器时进行相关的处理,在koa中一些常用的功能通过中间件实现如cookie/session 文件请求处理等等。

中间件的使用 下载 cnpm i 中间件 -D 引入require中间件 使用 server.use(中间件)

使用静态文件中间件 1.cnpm i koa-static -D

代码语言:javascript复制
const koa = require('koa');
const Router=require('koa-router');
const static = require('koa-static')
let server=new koa();
server.listen(8080);
server.use(static('./static'));//处理文件请求

static中间件的第二个参数可选用于一些选项设置 常用选项

代码语言:javascript复制
static('./path',{
    maxage://静态文件缓存时间毫秒为单位
    index://默认展示文件
})

根据上面两个选项我们可以设置不同静态文件的缓存时间

代码语言:javascript复制
const koa = require('koa');
const Router=require('koa-router');
const static = require('koa-static')
let server=new koa();
server.listen(8080);
let router = new Router();//创建一个总路由

let staticRouter = new Router();//静态路由
//设置图片请求过期时间
staticRouter.all(/(.jpg|.png|.gif)$/i,static('./static/images',{
    maxage:60*86400*1000//两个月过期
}))
server.use(staticRouter.routes())

server.use(router.routes());

post数据处理中间件

cnpm i koa-better-body -D 通过koa-better可以实现文件上传即post数据处理,post数据存放在ctx.request.fields

简单使用

代码语言:javascript复制
const koa = require('koa');
const Router=require('koa-router');
const static = require('koa-static');
const body = require('koa-better-body')//post数据处理
let server=new koa();
server.listen(8080);
let router = new Router();//创建一个总路由

server.use(body({
    uploadDir:'./static/upload'//文件上传保存目录
}));

server.use(async ctx=>{
    console.log(ctx.request.fields);//post/file信息存放在ctx.request上
    ctx.body='上传成功';
})

server.use(router.routes());

上传的文件不含后缀名

cookie与session koa自带cookie中间件

基本使用

代码语言:javascript复制
const koa = require('koa');
const Router=require('koa-router');
const static = require('koa-static');
const body = require('koa-better-body')
let server=new koa();
server.listen(8080);
let router = new Router();//创建一个总路由

server.keys=['sef','dfgr','dg']//循环密钥保证cookie安全

server.use(async ctx=>{  
   //设置cookies
   //set(key,value,{options})
    ctx.cookies.set('username','test',{
        maxAge:7*86400*1000,//一周后过期
        signed:true,//设置cookie签名状态防止cookie被篡改
    })
    //获取cookie
    //get(key)
    console.log(ctx.cookies.get('username'));//普通获取,不能进行cookie签名验证
    console.log(ctx.cookies.get('username',{signed:true}));//安全获取
})
server.use(router.routes());

获取cookie

session

koa中没有提供session功能,我们要引入第三方中间件 cnpm i koa-session -D 基本使用

代码语言:javascript复制
const koa = require('koa');
const Router=require('koa-router');
const session=require('koa-session');
let server=new koa();
server.listen(8080);
let router = new Router();//创建一个总路由

server.keys=[
  'asdfasdfasdfasdfasdf',
  'hghjfgjghjkyggfytyurt',
  'hjghjkfguig8ygyi8t78i8',
];//循环密钥 KOA强制session签名

server.use(session({
    maxAge:20*60*1000,//20分钟过期
    renew:true//当用户与服务器交互时重新计算过期时间
},server));
//session需要传递服务实例

//获取session
//ctx.session['key']
//设置session
//ctx.session['key']=value
server.use(async ctx=>{
    if(!ctx.session['view']){
        ctx.session['view']=0;

    }
    ctx.session['view']  ;
    ctx.body = `欢迎你第${ctx.session['view']}访问`
})
server.use(router.routes());

自定义中间件

在koa可以自定义中间件实现某些功能如常见的表单验证可以通过中间件实现

自定义中间件流程如下

1.新建目录libs存放中间件

2.在libs目录新键中间件文件validator.js

3.编写中间件

代码语言:javascript复制
//validator.js
let flag = 0;
module.exports={
    sayHi(){
        return (ctx,next)=>{
            // console.log(next())
            if(flag==1){
                next();//如果条件为真继续执行
            }

        }

    }
}

由于中间件必须为一个函数,我们给sayHi方法返回一个函数,在函数里面执行相关逻辑 4.主文件使用中间件

代码语言:javascript复制
const say= require('./libs/validator');//引入中间件
//sayHI方法
server.use(say.sayHi());//使用中间件
router.get('/middleware',async ctx=>{
    console.log('传递了参数执行这条语句')//如果中间件满足条件则执行这条语句
})
server.use(router.routes());

条件为假

条件为真

通过next实现批量处理错误

代码语言:javascript复制
server.use(async (ctx,next)=>{
    try{
       await next()
    }catch(e){
    
    ctx.body='错误'
    }
})

//处理大量路由错误
routet.all('*',async ctx=>{
    try{
        await next()
    }cach(e){
    .....
    }
})

数据库

引入 mysql co-mysql

使用

代码语言:javascript复制
const Koa = require('koa')
const Router = require('koa-router')
const mysql = require('mysql')
const co = require('co-mysql')

let conn = mysql.createPool({
    host:'localhost',
        user:'root'
        password:'',
        database:'ches'
});

let db = co(conn)

let server  = new Koa();
server.listen(8080)

server.context.db = db;将数据库对象设为全局,任意地方都可以使用

如
server.use(async ctx=>{
  ctx.db.......
})

0 人点赞