zoukankan      html  css  js  c++  java
  • koa-中间件使用

     
     写在前面:每个人面对生活的态度不一样,自己最舒服、最好的方式去面对生活是最好的状态~

    中间键作用

    中间键在开发业务中起着承上启下的作用,比如登录的时候我们相关接口需要做登录的校验,是的,我们不可能在每个请求的接口前都加上一个函数叫做checkLogin
    routes.post('/getblog',async (ctx,next)=>{
      checkLogin(ctx,next)
    })
    routes.post('/getoneBlog',async (ctx,next)=>{
      checkLogin(ctx,next)
    })
    这样的处理方式无一不是冗杂的,而且一旦我们的校验函数更改了名字,所有调用者都需要进行更改名字,这个复用的方式简直是低效的。
    • 对于此我们可以借助于php的beforeAction.每次进行访问action的时候,都先去执行beforeAction来进行前置的校验,
      public function beforeAction($action)
      {
         // 做校验啥哈哈哈
          }
    • 或者vue中的axios访问的请求拦截器,在请求拦截器中去增加一下访问内容等
    http.interceptors.request.use((config)=>{
      //在header中增加该校验 并带入到接口中 
      if(localStorage.token){
        config.headers.Authorization ="Bearer " +localStorage.token
      }
     return config;
    },(err)=>{
    
      return Promise.reject(err)
    })

    koa的中间键作用

    koa的中间键作用的原理使用也是如此,都是前置校验和后置的使用,

    如何使用和设置

    使用之前进行一个demo的案例分析
    const Koa = require("koa");
    var app = new Koa();
    app.use((ctx,next)=>{
      console.log("中间键1开始");
      next();
      console.log('中间键1结束')
    })
    
    app.use((ctx,next)=>{
      console.log("中间键2开始");
      next();
      console.log('中间键2结束')
    })
    app.listen(3000)
    访问请求后的内容为
     
    可以看到在访问的过程中以next作为路由的中间点,先进行next之前的操作,在进行next之后的操作,

    中间键分类

    在我们开发的时候,通常挂载在app实例上的元素在我们所有的路由请求中都会进行使用,但是根据我们的业务不同,我们需要在某个挂载的实例元素的中间键处理也是不同的,这个时候就需要我们对中间键的使用进行区分,区分为在局部路由使用的中间键以及在所有路由中使用的中间键

    局部路由内部使用中间键

    如我们服务端中主要承载着两个端的代码,分别为系统后台代码以及系统前台代码,
     
    我们对代码进行区分后,只想对admin里面的路由增加中间件,对于client的路由不需要增加中间键,此时如果直接将中间键处理函数增加到app的实例中显然是不合理的,需要增加到admin的路由实例中
    在admin目录下的路由控制文件中增加
    module.exports = (app)=>{
      //引用controller的控制器内容  
      const BlogController = require('../../controller/admin/blog.js') 
      const Router =  require('koa-router')
      //获得中间件
      const middleCheckLogin = require("../../middlewares/checkLogin.js")
      //创建子路由实例
      const router = new Router();
      //创建博客文章
      router.post('/opBlog',BlogController.opBlog)
      
      //根路由-父路由
      const router_root = new Router()
      //在父路由中使用中间键
      router_root.use(middleCheckLogin())
      // 在根路由中注册子路由
      router_root.use('/admin', router.routes(), router.allowedMethods()) 
      //再在app的实例中去挂载父路由
      app.use(router_root.routes(), router_root.allowedMethods()) 
    }

    在app.js中引用该路由的方式 app实例直接作为参数传入到路由文件中,这样在app.js中就不需要进行操作,直接引入路由文件即可

    // 引入路由
    require('./routers/admin/index')(app)

     此时我们将校验是否登录的中间件直接使用到了admin.js的路由中,在client的路由中,由于没有注册以及使用中间件,因此在访问中无影响

    全部路由使用中间件

    全局路由的中间件则是直接挂载在app的实例中,此时挂载尽量不要写在单个的路由文件中,可直接写在app.js的文件中
    // logger
    app.use(async (ctx, next) => {
      const start = new Date()  
      ctx.CODE =200 //全局都用到的CODE可直接写在ctx中
      await next()
      const ms = new Date() - start
      console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
    })
    app.use(checkLogin()) //直接使用中间件函数

    直接写在app的实例中,在全部的访问路由中都能够进行使用

    总结

    中间件更多时候代表着公共方法抽离等作用,主要应用在一些公用操作,比如:判断是否登录,校验当前用户状态等,

    而全局的中间件可用户我们进行打点记录,记录访问日志等,

    合理的设置中间件~

     

  • 相关阅读:
    第一类斯特林数,第二类斯特林数,组合数
    P1005 矩阵取数游戏
    P4609 [FJOI2016]建筑师
    射击小游戏一03(碰撞检测)
    CCLabelAtlas 特效 自定义CCLabelTTF
    CCSpriteBatchNode cocos2dx使用
    cocos2dx plist动画
    CCSpriteBatchNode 渲染
    cocos2dx 实现翻牌效果
    cocos2dx技能冷却
  • 原文地址:https://www.cnblogs.com/mfyngu/p/13060038.html
Copyright © 2011-2022 走看看