Nanoscale Parts Manufacturing

    awix

    1.8.2 • Public • Published

    awix

    基于HTTP/2模块和async/await关键字的web框架,支持功能:

    • 中间件
    • 路由分组/中间件分组
    • 解析Body数据
    • 限制请求数量
    • 限制指定IP的某一时间段内的最大请求数
    • 设置拒绝IP
    • 设置限制IP请求数的白名单
    • 中间件根据匹配规则执行
    • 守护进程模式
    • cluster集群
    • 全局日志
    • 显示负载情况

    awix通过一个被称为请求上下文的对象打包了所有需要的请求信息,并包括了本次请求的stream实例。

    安装

    npm安装

    #全局请使用 npm install -g awix
    npm install awix
    

    git方式

    git clone此仓库,然后引入awix.js文件。

    示例

    'use strict';
     
    const awix = require('awix');
     
    /*
      在后续部分会详细讲解awix的选项,每个选项都会有默认值,不传递参数同样可以。
      在后续的示例中,如果不是十分必要,则会略过new awix()的过程,使用serv或app表示awix实例。
    */
    var serv = new awix({
        //调试模式,默认为true
        //debug : false,
     
        /**
        * 设置单个IP2秒内最多请求100次。
        */
        maxIPRequest: 100,
        peerTime: 2,
     
        //设置每个进程同时处理请求的最大连接数。
        limit: 1000,
     
        //POST/PUT提交表单或上传文件时的最大数据,按照字节表示。
        bodyMaxSize: 10000000,
     
        //HTTPS密钥文件路径
        key : './localhost.key.pem',
     
        //HTTPS证书文件路径
        cert: './localhost.cert.pem',
    });
     
    var {router} = serv;
     
    router.get('/' async rr => {
        //rr被称为请求上文对象,稍后会详细讲解。
        //设置rr.res.data会自动返回结果。
        rr.res.data = 'success';
    });
     
    //使用run接口只会启动一个进程,daemon会使用cluster集群。
    serv.daemon(8118);
     

    获取URL参数

     
    serv.get('/test', async c => {
        //URL参数被解析到param属性中。
        c.res.data = c.param;
    });
     

    获取POST/PUT请求体数据

    请求体数据,通常是表单,不过这不是绝对的,请求体数据格式在消息头的content-type字段描述。

    content-type如果是application/x-www-form-urlencoded则表示是表单提交,也可以是其他类型,比如:

    • text/plain
    • text/json
    • text/xml
    • multipart/form-data

    其中,multipart/form-data可以提交表单,但通常用来上传文件。

    框架会自动解析application/x-www-form-urlencoded和multipart/form-data格式的数据,其他类型的则直接保存,不做处理。

    解析后的数据在bodyparam字段,如果是上传文件,则会在files字段中保存。

    获取表单数据

     
    var {router} = serv;
     
    router.post('/post-test', async c => {
      //返回解析后的数据,表单数据被解析成JSON对象的格式。
      c.res.data = c.bodyparam;
    });
     

    路由

    路由就是根据域名后的路径去查找并执行对应的函数。框架本身路由的添加方式很简单,支持使用:表示变量,使用*匹配任意路径。并且路由参数只是以字符串形式解析,并不做各种类型转换的处理。解析后的参数保存在args字段。

     
    /*
      name可以是任意字符串,访问形式:
        /page/index.html
        /page/a.html
    */
    serv.get('/page/:name', async c => {
      //解析后的参数保存在c.args
      c.res.data = c.args['name'];
    });
     
    serv.get('/login/:username/:passwd', async c => {
      var {username, passwd} = c.args;
      //....
    });
     
    serv.options('/*', async c => {
      //接管所有的OPTIONS请求
      //...
    });
     

    中间件

    中间件是框架提供的灵活强大的功能,依靠中间件可以方便的分离业务,组合完成复杂的功能,并且维护、替换都非常方便。

    中间件基于洋葱模型实现,处理过程可以用下图描述:

    按照这样的设计,后添加的中间件先执行,而在返回时则从内向外返回。其实就是函数调用栈结构。

    编写中间件

    中间件编写的参数有固定格式,执行下一层中间件也有固定写法。

     
    /**
     * 使用add添加中间件,中间件一定是async声明的函数,
     * 接受两个参数,c是请求上下文,next表示下一层中间件。
     * 要执行则只需要await next(c)。
     * 如果检测发现不合法需要停止向内执行,则只需要不写await next(c)
     * 
     * add同时接受第二个参数,如果不填写则表示全局执行。
     * 
     * */
    serv.add(async (c, next) => {
      c.res.data += 'I am middleware';
      await next(c);
      c.res.data += 'middleware end';
    }, {preg: '/mid-test'});
     
    serv.get('/mid-test', async c => {
      c.res.data += 'This test page for middleware';
    });
     

    访问/mid-test返回结果:

    
    I am middleware
    This test page for middleware
    middleware end
    
    

    使用add接口添加中间件,接受两个参数,第一个是请求上下文,第二个next表示下一层中间件。要执行则只需要

    await next(c)

    如果检测发现不合法需要停止向内执行,则只需要不写 await next(c)。

    add支持第二个参数,如果没有表示全局执行,所有的请求都会先执行此中间件,否则可以填写值如下:

    • 字符串:表示组的名称,只在路由分组内添加中间件。

    • JSON对象:{preg: PREG, group: GROUP},preg表示匹配规则,group表示组名称,两个是可选项。preg的值如下:

      • 字符串:只对此路由执行。
      • 字符串数组:在其中的字符串都会执行。
      • 正则表达式:匹配后执行。
    • 正则表达式或字符串数组:其实就是preg的匹配规则。全局添加。

    Install

    npm i awix

    DownloadsWeekly Downloads

    47

    Version

    1.8.2

    License

    MPL-2.0

    Unpacked Size

    351 kB

    Total Files

    25

    Last publish

    Collaborators

    • ant-army