ant-army
简单易用的轻量级Web框架,只有一个源代码文件。请求方法只提供了GET和POST,这两种方法完全足够。如果你喜欢RESTFul风格,可以去扩展它。
此框架不需要解析POST数据的扩展,会自动解析POST请求数据。并且可以灵活设置POST请求允许的最大数据量。
!注意:此框架是我在一个周末开发的,后来也在不断的更新。当时的目的是想用于教学以及针对个人学习使用。我会尽力去完善的更加专业,从开发计划来说,在2.0版本之前,不建议用于生产环境,或者仅可以用于对服务要求不是很严格的场景。
另一方面,在处理HTTP协议的时候,还没有加入数据压缩的支持,如果你的服务传输数据量不大可以使用,后续会加入压缩支持。
开发此框架之前,我一直使用PHP做Web开发,对LNMP架构比较了解。在PHP处理Web请求的时候,GET,POST提交的数据是被解析好,直接拿过来使用的,并且在$_FILES中可以找到上传的文件,我在使用express的时候是需要·配合其他扩展才可以完成这些操作的,所以我想设计一个能把GET,POST请求以及上传文件的操作自动处理的框架,但尽可能精简,不要过于复杂。
此框架在设计上从PHP的Slim框架得到一些灵感,在此也感谢Slim框架的设计者。
!使用node,开发环境一定要使用Linux,事实上,所有的服务端程序都要运行在Linux/Unix平台上,科学计算、机器学习等领域也都是在这些平台上,Windows上不能提供很好的支持,而且性能很差。如果你去了解,其实微软内部大量使用Linux,这也是微软公布过的。
本教程的示例使用了Linux命令,不要在Windows上试用。
安装
npm install ant-army
从Hello world开始
创建server.js文件,
const ant = require('ant-army');
ant.get('/', (req, res) => {
res.end('Hello world\n');
});
ant.run('127.0.0.1', 3456);
终端运行:node server.js
浏览器访问http://127.0.0.1:3456即可查看结果,或者使用curl命令:
$ curl 'http://127.0.0.1:3456/'
输出结果:Hello world
写给基础用户:
curl是一个Linux/Unix上的命令,实现了很多常见协议,能够通过命令快速发送数据。可以用于测试环境,脚本处理,嵌入其他程序等。如果你没有此命令需要安装,安装方式如下:
CentOS/ReadHat分支:sudo yum install curl
Ubuntu/Debian分支:sudo apt install curl
如果你是root用户登录(命令提示符会变成#),则不需要加上sudo。
加入POST请求
POST请求发送的数据会自动解析,你的代码在处理请求时,可以通过req.POST获取POST提交的数据,通过req.GET获取url的query参数。数据以JSON键值对的形式存储。
ant框架提供了res.send函数用于发送响应数据,在其内部会调用res.end函数。res.send会自动序列化JSON对象,Array对象。
const ant = require('ant-army');
ant.get('/', (req, res) => {
res.end('Hello world\n');
});
ant.post('/post-test', (req, res) => {
res.send(req.POST);
});
ant.run('127.0.0.1', 3456);
终端运行curl命令:
curl 'http://127.0.0.1:3456/post-test' -d 'a=123&b=345'
输出结果:
{"a" : "123", "b" : "345"}
上传文件
上传是POST请求,所以会被ant自动解析,上传文件和普通的POST表单请求的HTTP头信息字段Content-Type值不同,普通表单提交是application/x-www-form-urlencoded,而要是上传文件是multipart/form-data,上传的文件在body中还有一个扩展的头信息,也会有Content-Type表示的是文件的具体类型。
ant框架会检测两种不同的提交类型,如果是普通POST提交,数据会放在req.POST中,而上传文件时往往也会伴随着其他的表单提交,但是那些非文件类型和文件数据都按照相同的格式存放,只不过扩展头信息没有Content-Type,此时这些字段仍然会被解析到req.POST中。
上传的文件数据都放在req.upload_files中,上传的文件数据会按照上传时name值进行分类,比如表单中:
<input type="file" name="image">
上传时,服务端解析到的头信息表明了name的值,所以在req.upload_files['image']可以找到上传的文件,
注意这是一个数组,每个元素都是这样的形式:
{
'filename' : 文件的名称,
'data' : 文件数据,
'content-type' : 文件的媒体资源类型,
}
所以对于单个文件可以从req.upload_files['images'][0]找到
如果你同时上传了name值为file和image的文件,并且每个都是多个,则会有req.upload_files['image']和req.upload_files['file'],每个都是数组,数组中的元素就是上传的文件数据和基本信息。
处理上传的文件是很简单的,ant提供了moveUploadFile接口处理上传的文件,实际上你可以用你自己的函数直接操作req.upload_files数据。
const ant = require('ant-army');
ant.config.upload_path = './upload';
ant.post('/upload', (req, res) => {
if (req.upload_files['image'] !== undefined) {
var up_ret = ant.moveUploadFile(req.upload_files['image'], 0, 'image');
if (up_ret === false) {
res.send('Error : file not found');
} else if (up_ret.message !== undefined) {
res.send(up_ret.message);
} else {
res.send(up_ret);
}
} else {
res.send('Error: file not found');
}
});
ant.run('127.0.0.1', 3456);
配置选项
你可以通过ant.config获取配置选项,并且可以直接修改。在使用ant.run或ant.ants运行时会自动生效。
ant.config = {
post_max_size : 10000000,
static_path : '',
static_on : false,
daemon : false,
log_file : './access.log',
error_log_file : './error.log',
log_type : 'stdio',
upload_path : './upload',
https_on : false,
https_options : {
key : '',
cert : ''
},
};
静态文件支持
const ant = require('ant-army');
ant.config.static_on = true;
ant.config.static_path = './static';
ant.run('127.0.0.1', 3456);
中间件
ant提供了简单的中间件模式,比如你想支持session会话,上传文件进行过滤都可以使用中间件完成。
中间件调用的最后一定要有next.method(req, res, next.next);说实话,设计成这个样子我也不是十分满意,最开始的版本是要求中间件必须是同步的处理过程,但是由于很多操作可能会涉及到异步,所以中间件使用了Promise回调链,这是一个自动执行的过程,所以也要求必须要这样写。中间件可以是同步,也可以使用Proimse完成异步操作。
后续的版本中计划简化中间件的编写,不过如果仅仅是编写简单的中间件逻辑上并不复杂。并且我也开发了几个常用的中间件,可以直接使用。
ant的中间件是一个接收三个参数的函数:
function(req, res, next) {
...
...
return next.method(req, res, next.next);
}
function(req, res, next) {
return new Promise((rv, rj) => {
...
rv({
req : req,
res : res,
next : next
});
}).then((rr) => {
...
return rr.next.method(rr.req, rr.res, rr.next.next);
});
}
中间件支持路由匹配,如果不设置,默认为所有路由都会经过中间件的处理。
ant提供了两个接口用于添加中间件,ant.addmiddle 和 ant.usemiddle,ant.usemiddle会调用ant.addmiddle。
ant.addmiddle添加中间件:
ant.addmiddle((req, res, next){
...
return next.method(req, res, next.next);
}, '/test');
使用中间件支持跨域
ant.addmiddle((req, res, next){
res.setHeader('Access-Control-Allow-Origin', '*');
return next.method(req, res, next.next);
}, '');