zoukankan      html  css  js  c++  java
  • egg中间件

    中间件:匹配路由前、匹配路由完成做的一系列的操作。 Egg 是基于 Koa 实现的,所以 Egg 的中间件形式和 Koa 的中间件形式是一样的,都是基于洋葱圈模型

    Koa中的中间件:

        http://eggjs.org/zh-cn/intro/egg-and-koa.html#midlleware

    Egg中的中间件:

        http://eggjs.org/zh-cn/basics/middleware.html


    一般来说中间件也会有自己的配置。在框架中,一个完整的中间件是包含了配置处理的。我们约定一个中间件是一个放置在 app/middleware 目录下的单独文件,它需要 exports 一个普通的 function,接受两个参数:
        options: 中间件的配置项,框架会将 app.config[${middlewareName}] 传递进来。
        app: 当前应用 Application 的实例。

    demo:

    app/middleware文件下

    创建中间件forbidip.js和printdate.js中间件:

    module.exports = (options, app) => {
       
        //返回一个异步的方法
        return async function forbidIp(ctx,next){
    
                //要屏蔽的id : 1.从数据库获取     2、从参数传入
              
                var forbidips=options.forbidips;  
    
            //    console.log(forbidips);
    
    
                //获取客户端的ip
    
                var clientIp=ctx.request.ip;            
                //some和forEach相似
                var hasIp=forbidips.some(function(val){
                    
                    if(val==clientIp){
    
                        return true;
                    }
    
                })
    
                if(hasIp){
                    //屏蔽
                       ctx.status = 403;                
                       ctx.body='您的ip已经被屏蔽';
    
                }else{
                    await next();
    
                }
      
    
               
        }
    
    };
    // module.exports = (options, app) => {
       
    //     //返回一个异步的方法
    //     return async function forbidIp(ctx,next){
    
    //             //要屏蔽的id : 1.从数据库获取     2、从参数传入
    
    
    
    //             /*要屏蔽的ip*/
    //             var forbidip='127.0.0.1';
    
    //             //获取客户端的ip
    
    //             // console.log(ctx.request.ip)
    
    //             if(ctx.request.ip==forbidip){
    
    //                 ctx.status = 403;                
    //                 ctx.body='您的ip已经被屏蔽';
                   
    //             }else{
    //                 await next();
    //             }
               
    //     }
    
    // };
    /*
    options: 中间件的配置项,框架会将 app.config[${middlewareName}] 传递进来。
    app: 当前应用 Application 的实例。
    
    
    配置中间件
    
    */
    
    module.exports = (options, app) => {
       
        console.log(options);
        //返回一个异步的方法
        return async function printDate(ctx,next){
    
    
                console.log(new Date());
    
                await next();
        }
    
    };

    在config.defalt.js下

     // 增加配置中间件
      config.middleware = ['printdate','forbidip'];
    
      //给printdate中间件传入的参数
      config.printdate={
    
        aaa:'aaaaaa'
      }
    
    
      config.forbidip={
    
        forbidips:[
          '127.0.0.1',
          '192.168.0.195'
        ]
      }

     


    router.js 路由中使用中间件

    创建 middleware/auth.js

    module.exports=(option,app)=>{
        return async function auth(ctx,next){
        console.log(option);
        console.log(new Date());
        await next(); }
    }
    2router.js 挂载指定的中间件

     

    module.exports = app => {
    const { router, controller } = app;
    //路由中获取中间件
    const auth = app.middleware.auth({ attr: 'this is router.js middleware' }); router.get('/', auth,controller.home.index);
    router.get('/news', controller.news.index);
    router.get('/shop', controller.shop.index);
    };
    
    
    框架默认中间件的配置
    config.bodyParser={
      jsonLimit: '10mb' //Default is 1mb.
    }
    
    

    Egg.js 中使用 koa 的中间件 (规范的 Koa 的中间件)

    Egg.js 框架里面可以非常容易的引入 Koa 中间件生态。

    使用 koa-compress 开启服务器 Gzip 压缩功能,以 koa-compress 为例,在 Koa 中使用的方 法:

    const koa = require('koa');
    const compress = require('koa-compress');
    const app = koa();
    const options = { threshold: 2048 }; app.use(compress(options));

    按照规范来在应用中加载这个 Koa 的中间件:

    module.exports = require('koa-compress');
    config.middleware = ['compress'];
     config.compress = {
      threshold: 1024 //它支持指定只有当 body 大于配置的 threshold 时才进行 gzip 压缩 
    };

    Egg.js 中使用 koa 的中间件 (非规范的 Koa 中间件)

    // config/config.default.js 
    module.exports = {
        webpack: {
               compiler: {}, 
                others: {},
        },
     };
    // app/middleware/webpack.js
    const webpackMiddleware = require('some-koa-middleware');
    module.exports = (options, app) => {
        return webpackMiddleware(options.compiler, options.others);
    }    

    Egg.js 中间件的通用配置

    无论是应用层加载的中间件还是框架自带中间件,都支持几个通用的配置项:

    enable:控制中间件是否开启。

    match:设置只有符合某些规则的请求才会经过这个中间件。

    ignore:设置符合某些规则的请求不经过这个中间件。

    https://eggjs.org/zh-cn/basics/middleware.html


    demo:

    egg 中间件的基本配置

    app/middleware/auth.js

    module.exports=(option,app)=>{
    
    
    
        return async function auth(ctx,next){
    
    
            console.log(option);
    
            //实现中间件的功能
    
            console.log(new Date());
    
    
            await next();
    
        }
    
    }

    config/config.default.js

      // 配置中间件
      config.middleware = ['auth'];
    
      //给中间件传参
      config.auth={
        title:'this is auth'
      }

    路由中使用中间件

    router.js中

    'use strict';
    
    /**
     * @param {Egg.Application} app - egg application
     */
    module.exports = app => {
      const { router, controller } = app;
    
      //路由中获取中间件
    
      var auth=app.middleware.auth({title:'this is router.js  middleware'})
    
      router.get('/',auth, controller.home.index);  
    
    };

    egg中使用koa中间件插件

    在app/middleware下

    创建compress.js

    //egg.js中使用koa-compress开启压缩
    
    
    
    /*
    
    egg.js中配置koa-compress模块:
    
    
    1、安装 cnpm  install koa-compress --save
    2、middleware文件夹下面新建一个compress.js
    
    3、在jsonp.js中引入koa-compress 并且通过module.exports暴露
    module.exports=require('koa-compress');
    
    4、config.default.js中配置jsonp中间件   config.middleware = ['compress'];
    
    */
    
    
    module.exports=require('koa-compress');
    
    
    
    
    //非标准的中间件
    
    /*
    koa中的非标准中间件的配置
    
        const Middleware = require('some-koa-middleware');
    
    
        app.use(Middleware(options.compiler,options.xxxx))
    
    
    egg.js中非标准的中间件配置:
    
    
    const Middleware = require('some-koa-middleware');
    module.exports=(option,app)=>{
        return Middleware(options.compiler,options.xxxx);
    
    }
    
    */

    jsoup.js

    //egg.js的中间件生态基于koa
    /*
    
    egg.js中配置koa-jsonp模块:
    
    
    1、安装 cnpm  install koa-jsonp --save
    2、middleware文件夹下面新建一个jsonp.js
    
    3、在jsonp.js中引入koa-jsonp 并且通过module.exports暴露
    module.exports=require('koa-jsonp');
    
    4、config.default.js中配置jsonp中间件   config.middleware = ['jsonp'];
    
    */
    
    var jsonp=require('koa-jsonp');
    
    module.exports=jsonp;

    在config.default.js配置中间件

    // 配置中间件
      config.middleware = ['jsonp','compress'];
      config.compress = {
        threshold: 1024 //它支持指定只有当 body 大于配置的 threshold 时才进行 gzip 压缩
      };
      //框架中间件的默认配置
      config.bodyParser={
        jsonLimit: '10mb' //Default is 1mb.   
      }

    egg中的通用设置

    / config.middleware = ['auth','jsonp','compress','adminAuth'];
      // 配置中间件
      config.middleware = ['auth','jsonp','compress'];
    
      config.compress = {
        // enable:false,    
        threshold: 1024 //它支持指定只有当 body 大于配置的 threshold 时才进行 gzip 压缩
      };
    
      //https://eggjs.org/zh-cn/basics/middleware.html
      config.auth = {
        // enable:false, 
        // match: '/news',
        // ignore:'/news',
    
        match(ctx){
          // ctx 上下文  可以获取请求的地址
          console.log(ctx.request.url);
          if(ctx.request.url=='/shop' || ctx.request.url=='/news'){
            return true;
          }
          return false;      
        },
        title:'this is  middleware'
      };
    
    
  • 相关阅读:
    calendar.getTimeInMillis() 和 System.currentTimeMillis() 的区别
    微信小程序中使用 <web-view> 内嵌 H5 时,登录问题的处理方法
    小程序 TabBar 定制
    webpack 代码优化压缩方法
    react-router v4 按需加载的配置方法
    axios发送post请求,如何提交表单数据?
    react中键盘enter事件处理
    常用证件正则表达式
    react中input自动聚焦问题
    React Router v4 页面传值的三种方法
  • 原文地址:https://www.cnblogs.com/loaderman/p/11543116.html
Copyright © 2011-2022 走看看