awix
v1.8.2
Published
a powerful web framework, build on module http2 and async/await.
Downloads
9
Maintainers
Readme
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的匹配规则。全局添加。