0.2.11 • Published 4 years ago

chestnut-app v0.2.11

Weekly downloads
6
License
MIT
Repository
github
Last release
4 years ago

chestnut-app 快速web开发框架

chestnut-app是一个基于KOA2的快速web开发框架,要求node版本为7.X和8.X

内置了常用中间件(请求体解析、路由控制、会话控制、路由过滤器等)、多进程启动和proxy协议代理。

并且提供常用工具类,包括数据库操作、页面抓取操作、html内容抽取、编解码等

一个完整的chestnut-app必须同时引入chestnut-routerchestnut-sessionchestnut-utils模块

具体测试和示例请参考:https://github.com/nandy007/chestnutdemo

使用方法

基础使用方法

// 引入path模块
const path = require('path');
// 引入chestnut-app模块,其为一个继承了Koa的实例化对象
const app = require('chestnut-app');

// 启动app
app.start({
	port : 3001,// 必须
	rootPath : path.join(__dirname), // 必须
	// 中间件配置,其中sessionConfig不是必须的,这里使用的是mysql做session数据存储
	// 除此之外,其他的中间件配置也可以在此设置
	middleware: { 
    	sessionConfig: {
      		key: 'SESSIONID',
      		storeConfig: {
    			id: 'main',
    			type: 'mysql',
    			database: 'test',
    			user: 'root',
    			password: 'root',
    			port: '3306',
    			host: 'localhost'
  			} // session存储配置,为数据库信息,如果不配置则使用默认存储;
    	}
  	}
});

以上代码就简单完成了app的启动。

需要注意的是,默认需要在应用根目录下创建routers文件夹、views文件夹,根目录的上一级创建static目录

支持的中间件

chest-app内置请求体解析中间件、静态资源加载中间件、服务端模板引擎中间件、session会话控制中间件和router路由控制中间件。

各个中间件均有默认值,可以不需要配置或者简单配置即可,也可以自定义,同时支持路由过滤器扩展。

中间件的配置位于启动配置的middleware属性,可设置的参数说明如下:

const middleware = {
	/*带附件上传请求体解析器(multipart/form-data)
	  默认可不设置,可通过ctx.request.body和ctx.request.query取值
	  也可以设置为一个async function函数
      或者设置为false不使用,这时候需要自己去使用过滤器拦截路由处理
	*/
	multiParser : ,
	/*普通请求体解析器
	  默认可不设置,可通过ctx.request.body和ctx.request.files取值
	  也可以设置为一个async function函数
      或者设置为false不使用,这时候需要自己去使用过滤器拦截路由处理
	*/
	bodyParser : ,
	/*静态文件目录路径
	  默认可不设置,默认使用rootPath的上一级的static目录
	  也可以设置为一个目录路径
      或者设置为false不使用,这时候需要自己去添加中间件
	*/
	staticPath : ,
	/*视图文件目录路径
	  默认可不设置,默认使用koa-view中间件,且指向rootPath下的views目录
	  也可以设置为一个目录路径
      或者设置为false不使用,这时候需要自己去添加中间件
	*/
	viewPath : ,
	/*会话配置
	  默认可不设置, 默认使用koasession的memory管理会话
	  如果要使用则必须至少设置key(会话id前缀)和storeConfig(数据库存储信息)
	  或者设置为false不使用,这时候需要自己添加中间件
	*/
	sessionConfig : ,
	/*路由文件目录路径
	  默认可不设置,默认使用rootPath下的routers目录
      也可设置为一个目录路径
      或者设置为false不使用,这时候需要自己添加中间件
	*/
	routerPath : ,
	
}

需要注意的是:

  1. routerPath的配置需要在路由文件中使用chestnut-router模块来创建router对象,比如:
// 返回的是koa-router对象,代表父目录为/interface,如果是根目录使用/
const router = require('chestnut-router').create('/interface');

module.exports = router
  .get('/login', async function(ctx){
		ctx.body = 'hi chestnut app';
	}); // 访问路径为http://ip:port/interface/login

使用方法请移步:chestnut-router

  1. sessionConfig的配置默认使用内存保存会话,也支持使用mysql数据库保存会话实现跨域。

使用方法请移步:chestnut-session

支持的启动方式

方式一:单进程启动

// 采用单进程启动app
app.start(config);

方式二:多进程启动

此方式实际采用的cluster模块启动app,fork的数量为cpu个数

// 采用多进程启动app
app.startCluster(config);

方式三:仅初始化不启动

此方式实际仅初始化了中间件,但是不直接启动,需要开发者自己启动,比如:

// 仅初始化
app.init(config);
// 手动创建服务器,并使用app中间件
var server = require('http').createServer(app.callback());
// 启动服务器
server.listen(config.port);

支持proxy代理

内置使用http-proxy模块作为代理,目前支持算法:roundrobin、vhost和sourcebalancer,并支持自定义算法。

proxy默认使用cluster方式启动。

使用方法为:

// 启动proxy代理
app.startProxy(config);

roundrobin算法

仅实现简单的循环调用。需要config必须设置rule属性为roundrobin,并且设置servers属性配置服务器地址。一般用于实现负载均衡。

app.startProxy({
	port : 3000,
	rule : 'roundrobin',
	servers : [
		{
			"host":"localhost",
			"port":"3001"
		},
		'http://localhost:3002'
	]
});

注:servers的每个元素包含两种写法,一种是对象{host,port},一种是protocol://ip:port

vhost算法

实现简单的域名映射服务。需要config必须设置rule属性为vhost,并且设置router属性配置域名映射信息。一般用于反向代理。

app.startProxy({
	port : 80,
	rule : 'vhost',
	router : {
		"www.nandy.com": {
			"host": "localhost",
			"port": "3000"
		},
		"app1.nandy.com": {
			"host": "localhost",
			"port": "3001"
		},
		"app2.nandy.com": {
			"host": "localhost",
			"port": "3002"
		}
	}
});

注:router对象内的属性是域名地址,其值包含两种写法,一种是对象{host,port},一种是protocol://ip:port

sourcebalancer算法

实现基于请求源的负载策略,同一个session会话的请求均指向同一台服务器。

app.startProxy({
	port : 3000,
	rule : 'sourcebalancer',
	servers : [
		{
			"host":"localhost",
			"port":"3001"
		},
		'http://localhost:3002'
	]
});

自定义算法

要求设置rule属性为一个函数,此函数接受一个参数,并需要return一个function函数,此函数接受三个参数分别为req、res和proxy,其中req为koa的请求体,res为koa的响应体,proxy是http-proxy的实例对象,一般可以通过req和res来做业务逻辑,最后需要使用proxy来实现代理设置。

比如:

app.stratProxy({
	port : 8080,
	rule : function(config){
		return function(req, res, proxy){
			/*根据一些逻辑算法得出要代理的目标服务器
			  target必须符合{ip,port}或者protocol://ip:port形式
			*/
			const target = ...;
			proxy.web(req, res, { target: target });
		}
	}
});

工具类的使用

chestnut-app内置模块提供了数据库操作类、编解码类、网络请求类、html内容选择类等。具体用法请进入移步chestnut-utils

0.2.11

4 years ago

0.2.10

5 years ago

0.2.9

5 years ago

0.2.8

6 years ago

0.2.7

6 years ago

0.2.6

6 years ago

0.2.5

6 years ago

0.2.4

7 years ago

0.2.3

7 years ago

0.2.2

7 years ago

0.2.1

7 years ago

0.2.0

7 years ago

0.1.6

7 years ago

0.1.5

7 years ago

0.1.4

7 years ago

0.1.3

7 years ago

0.1.2

7 years ago

0.1.1

7 years ago

0.1.0

7 years ago

0.0.3

7 years ago

0.0.2

7 years ago

0.0.1

7 years ago