![](https://github.com/master-genius/awix/raw/HEAD/images/awix-load-info.png)
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');
var serv = new awix({
maxIPRequest: 100,
peerTime: 2,
limit: 1000,
bodyMaxSize: 10000000,
key : './localhost.key.pem',
cert: './localhost.cert.pem',
});
var {router} = serv;
router.get('/' async rr => {
rr.res.data = 'success';
});
serv.daemon(8118);
获取URL参数
serv.get('/test', async c => {
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 => {
c.res.data = c.bodyparam;
});
路由
路由就是根据域名后的路径去查找并执行对应的函数。框架本身路由的添加方式很简单,支持使用:表示变量,使用*匹配任意路径。并且路由参数只是以字符串形式解析,并不做各种类型转换的处理。解析后的参数保存在args字段。
serv.get('/page/:name', async c => {
c.res.data = c.args['name'];
});
serv.get('/login/:username/:passwd', async c => {
var {username, passwd} = c.args;
});
serv.options('/*', async c => {
});
中间件
中间件是框架提供的灵活强大的功能,依靠中间件可以方便的分离业务,组合完成复杂的功能,并且维护、替换都非常方便。
中间件基于洋葱模型实现,处理过程可以用下图描述:
![](https://github.com/master-genius/awix/raw/HEAD/images/middleware.png)
按照这样的设计,后添加的中间件先执行,而在返回时则从内向外返回。其实就是函数调用栈结构。
编写中间件
中间件编写的参数有固定格式,执行下一层中间件也有固定写法。
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的匹配规则。全局添加。