用Node.js 写web框架(二)
2012-11-15 16:53
453 查看
题外话:事实证明,扩展自建类型是如此的不靠谱,果断放弃掉了自建库这件事,但是暂时不打算引入underscore,先使用完全原生的js方法写吧。后期如果发现却是需要依赖工具库,再添加不迟。
今天大体上完成了Dispatcher这部分。
其实并不复杂,流程如下:
1、请求到来,首先判定是否为静态文件请求,如果是,则直接返回静态文件(这里后期要加入静态文件缓存)
2、拆分URL,根据以下规则来调用相应的模块处理请求:
'/':检测./views.js模块,并调用其中的index()函数处理请求
'/aaa': 检测./views.js模块,如果其中包含函数aaa(),则调用该函数;
未找到,则调用./modules/aaa/views.js中的index()函数
'/aaa/bbb':调用./modules/aaa/views.js中的bbb()函数
'/aaa/bbb/ccc/ddd':调用./modules/aaa/views.js中的bbb()函数
3、如果前面的函数查找失败,则返回404
代码部分:
细节上有一个关于调用函数时参数的问题,设计如下:
请求中所有的query string parameters,将进行包裹。如/aaa?name=jeky&age=25会被转换为:
var param = {name : 'jeky', age : '25'},一般来讲,被调用函数的第一个参数为这个。
特别的,对于url中目录级别大于2的情形,如(/aaa/bbb/ccc/ddd),在调用时会将大于2的部分也传入函数,顺序为第一个参数'ccc',第二个为'ddd'。
函数的最后两个参数为request和response,node.js自带的,特殊情况下用得上。
总例,对于/aaa/bbb/ccc/ddd?name=jeky&age=25相当于:
下面另一件事情就是引入了Dispatcher的配置:
这部分可以在初始化Dispatcher的时候进行修改。
剩下的工作就是需要把Dispatcher绑定在Server上就可以啦
今天大概就这么多吧,最近总得去各种地方办事,静不下心来。
今天大体上完成了Dispatcher这部分。
其实并不复杂,流程如下:
1、请求到来,首先判定是否为静态文件请求,如果是,则直接返回静态文件(这里后期要加入静态文件缓存)
2、拆分URL,根据以下规则来调用相应的模块处理请求:
'/':检测./views.js模块,并调用其中的index()函数处理请求
'/aaa': 检测./views.js模块,如果其中包含函数aaa(),则调用该函数;
未找到,则调用./modules/aaa/views.js中的index()函数
'/aaa/bbb':调用./modules/aaa/views.js中的bbb()函数
'/aaa/bbb/ccc/ddd':调用./modules/aaa/views.js中的bbb()函数
3、如果前面的函数查找失败,则返回404
代码部分:
this.handle = function(request, response){ var reqParam = url.parse(request.url); if(requestStatics(reqParam, response)){ handleStatics(reqParam, response); return; } var view = findView(reqParam.pathname); if(view){ // organize the arguments of view function var args = []; var param = wrapParam(reqParam); var paths = splitPath(reqParam.pathname); if(paths.length > 2){ for(var i = 2; i < paths.length; i++){ args.push(paths[i]); } } args.push(param); args.push(request); args.push(response); view.apply(this, args); return; } option.on404(request, response); }逻辑上就如同前面这个流程一样。
细节上有一个关于调用函数时参数的问题,设计如下:
请求中所有的query string parameters,将进行包裹。如/aaa?name=jeky&age=25会被转换为:
var param = {name : 'jeky', age : '25'},一般来讲,被调用函数的第一个参数为这个。
特别的,对于url中目录级别大于2的情形,如(/aaa/bbb/ccc/ddd),在调用时会将大于2的部分也传入函数,顺序为第一个参数'ccc',第二个为'ddd'。
函数的最后两个参数为request和response,node.js自带的,特殊情况下用得上。
总例,对于/aaa/bbb/ccc/ddd?name=jeky&age=25相当于:
var param = { name : 'jeky', age : '25' } bbb('ccc', 'ddd', param, request, response);
下面另一件事情就是引入了Dispatcher的配置:
var defaultOption = { modulePath : 'modules', indexName : 'index', viewFilename : 'views.js' on404 : on404DefaultHandler, on500 : on500DefaultHandler, }
这部分可以在初始化Dispatcher的时候进行修改。
剩下的工作就是需要把Dispatcher绑定在Server上就可以啦
require('./dispatcher.js'); var dispatcher = new Dispatcher(); http.createServer(function (req, res) { dispatcher.handle(req, res); }).listen(8080);
今天大概就这么多吧,最近总得去各种地方办事,静不下心来。
相关文章推荐
- 支付宝前端团队详解基于Node.js Web框架Chair
- Node.js Web 开发框架大全《中间件篇》
- 十大 Node.js 的 Web 框架
- 用Node.js 写web框架(五点五)
- 用Node.js 写web框架(番外)
- Node.js学习-一步步完善一个web框架-1
- 十大 Node.js 的 Web 框架,快速提升工作效率
- [Node.js]14款最佳的Node.js Web框架
- 十大 Node.js 的 Web 框架_快速提升工作效率
- 用Node.js 写web框架(三)
- Node.js轻量级Web框架Express4.x使用指南
- Koa (koajs) 基于 Node.js 平台的下一代 web 开发框架
- Koa – 更加强大的下一代 Node.js Web 框架
- express(基于 Node.js 平台,快速、开放、极简的 web 开发框架)
- Node.js 入门手册:那些最流行的 Web 开发框架
- 分享一个基于 Node.js 的 Web 开发框架 - Nokitjs
- 用Node.js 写web框架(一)
- 7个Node.js的Web框架
- node.js web应用基本框架
- JavaScript之node.js-web框架Koa学习