小弟我也来学习nodejs 没有就自己来 色色实现迷你 MVC

我也来学习nodejs 没有就自己来 色色实现迷你 MVC我也来学习nodejs 郁闷的天 文档很不咋的 实例根本跟不上

我也来学习nodejs 没有就自己来 色色实现迷你 MVC

我也来学习nodejs 郁闷的天 文档很不咋的 实例根本跟不上 产品不成熟

?

完事开头难,聊天室还是有困难的啊 写起来 今天下午第一次接触这个玩意 ...

?

忽然发现 完全与之前的web开发 不挂钩 后端 还得自己去 处理各种请求 ....

?

实现聊天室 如果没有一个标准的话 后面东西很乱.... 写就写好 ...

?

先把框架雏形写出来再说 ... 靠 我也实现个MVC出来玩

?

下面这个雏形 基本源自 我自己的php框架思想 .... 基本有了 明天继续实现

?

今明2天把 框架实现好,后面可以自己叠加应用了 .......

?

可能哥以后 就有段时间折腾这破玩意了...

?

?

?

console.log('kenxu聊天室程序');/* * 编码规范: * 模块引用,类定义 均使用驼峰风格定义 *  */// 实现 简易的MVC模式var Http = require('http');var System = require("sys");var FileSystem = require("fs");var Url = require("url");// 工具代码var __undef = 'undefined',__proto = "prototype";Object.extend = function(dest, source) {for (var property in source) dest[property] = source[property];return dest;};Object.extend(String[__proto],{trim: function(){return this.replace(/^\s+|\s+$/g, '');}});var Utilities = {arrayMap: function(list, fn) {if (list && list.length){var r = [];for (var i = 0; i < list.length; i++) {var x = fn(list[i], i);if (x !== null) {r.push(x) ;}}return r ;}return [];} ,each: function(list,fn){if (list && list.length)for (var i = 0; i < list.length; i++)if (fn.call(list[i],i) == '#end#') break ;}};/** * UDI 对象 实现请求资源定位器 * @type  */var UDI = {UDI_MODULE: 'module',UDI_CONTROLLER: 'controller',UDI_ACTION: 'action',DEFAULT_MODULE: 'default', DEFAULT_CONTROLLER: 'application', DEFAULT_ACTION: 'index' ,normalize: function(module,controller,action){var udi = {};udi[UDI.UDI_MODULE] = module || UDI.DEFAULT_MODULE;udi[UDI.UDI_CONTROLLER] = controller || UDI.DEFAULT_CONTROLLER;udi[UDI.UDI_ACTION] = action || UDI.DEFAULT_ACTION;return udi;},format: function(udi){var udi = udi || {};if (!udi[UDI.UDI_MODULE]){    udi[UDI.UDI_MODULE] = UDI.DEFAULT_MODULE;    }    if (!udi[UDI.UDI_CONTROLLER]){    udi[UDI.UDI_CONTROLLER] = UDI.DEFAULT_CONTROLLER;    }    if (!udi[UDI.UDI_ACTION]){    udi[UDI.UDI_ACTION] = UDI.DEFAULT_ACTION;    }return udi;},dumpString: function(udi){return udi[UDI.UDI_CONTROLLER] + '/' + udi[UDI.UDI_ACTION] + '@' + udi[UDI.UDI_MODULE];}};function __pathinfo_filter(pathinfo){var pathinfo = pathinfo || '/';var parts = pathinfo.substr(1).split('/');var params = {};if (parts[0] && parts[0].trim().length > 0){params[UDI.UDI_CONTROLLER] = parts[0].trim();}if (parts[1] && parts[1].trim().length > 0){params[UDI.UDI_ACTION] = parts[1].trim();}    for (var i = 2; i < parts.length; i += 2) {        if (parts[i + 1]) {            params[parts[i]] = parts[i + 1];        }    }        // 校验 UDI参数是否存在return UDI.format(params);}/** * 单一入口分发器 * @type  */function Dispatcher(request, response){this.request = request;this.response = response;this.params = null;this.requestUDI = null;this.parsePathinfo = function(pathinfo){return __pathinfo_filter(pathinfo);};this.params = this.parsePathinfo(Url.parse(request.url).pathname);/** * 设置请求资源对象 * @param {} udi */this.setRequestUDI = function(udi){// 调用此方法之前必须 手动对 参数udi 做 format操作for(var p in udi){if (udi.hasOwnProperty(p))this.params[p] = udi[p];}this.requestUDI = udi;};this.setRequestUDI(this.params);/** * 请求分发 * @param {} udi */this.dispose = function(udi){if (udi) this.setRequestUDI(udi);console.log(this.params);// 加载控制器类var sc = this.loadController(this.requestUDI);if (!sc){response.writeHead(404, {'Content-Type': 'text/plain'});var msg = '控制器不存在: udi=' + UDI.dumpString(this.requestUDI);response.end(msg + '\n');return;}if (!sc.existsAction(this.requestUDI[UDI.UDI_ACTION])){response.writeHead(404, {'Content-Type': 'text/plain'});var msg = 'Action不存在: udi=' + UDI.dumpString(this.requestUDI);response.end(msg + '\n')return;}var resonse = sc.execute(this.requestUDI[UDI.UDI_ACTION]);return resonse;};/** * 加载控制器 * @param {} udi *  * @return Controller */this.loadController = function(udi){do {var module = udi[UDI.UDI_MODULE];if (! (App.controllerPackage[module]) )break;var controller = udi[UDI.UDI_CONTROLLER];if (! (App.controllerPackage[module][controller]) )break;return new App.controllerPackage[module][controller](this);} while(false);return null;};}/** * 控制器类 * @param Dispatcher dispatcher */function Controller(){this.isGet = function(){return this.dispatcher.request.method === 'GET';};this.isPost = function(){return this.dispatcher.request.method === 'POST';};this.isHead = function(){return this.dispatcher.request.method === 'HEAD';};/** * action 是否存在 *  * @param string action * @return boolean */this.existsAction = function(action){var met = action + 'Action';return this[met] && typeof this[met] == 'function';};/** * 执行action * @param string action *  * @return mixed */this.execute = function(action){var met = action + 'Action';return this[met]();};/** * 将请求转发到 指定 的UDI *  * @param string module * @param string controller * @param string action *  * @return mixed */this.forward = function(module,controller,action)    {    return this.dispatcher.dispose(UDI.normalize(module,controller,action));    }} var App = {controllerPackage: {}};// 定义缺省模块里面的控制器App.controllerPackage[UDI.DEFAULT_MODULE] = {};// 定义默认控制器模块的快捷引用var __scp_default = App.controllerPackage[UDI.DEFAULT_MODULE];__scp_default.application = function(dispatcher){this.dispatcher = dispatcher;this.indexAction = function(){return this.forward('default','hello','index');};};__scp_default.application.prototype = new Controller();__scp_default.hello = function(dispatcher){this.dispatcher = dispatcher;this.indexAction = function(){return '找到B';};};__scp_default.hello.prototype = new Controller();Http.createServer(function (request, response) {//try {//设置2个处理器: 1. 处理静态资源文件; 2. 处理动态请求的资源var wd = new Dispatcher(request, response);var rst = wd.dispose();if (rst){response.writeHead(200, {'Content-Type': 'text/plain'});response.end(rst + '\n');}// 每次必须调用 不然客户端似乎会傻傻的等 ... 暂不理解为什么response.end();//} //catch(e){//console.log(e);//}}).listen(8124);