Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

awix

Package Overview
Dependencies
Maintainers
1
Versions
23
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

awix

a powerful web framework, build on module http2 and async/await.

  • 1.8.2
  • latest
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
4
Maintainers
1
Weekly downloads
 
Created
Source

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的匹配规则。全局添加。

Keywords

FAQs

Package last updated on 23 Aug 2019

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc