之前有写过一篇nodejs入门包括服务器的各种配置,npm安装。这篇文章也得到了很多人的肯定,在这里我也非常的感谢大家。今天给大家介绍的是nodejs的myweb框架的基本认识,myweb框架的开发心得,以及遇到的一些问题。<br/> 一、什么是myweb框架?<br/> 他是一个基于nodejs的web应用框架,其中应用到了express框架和jade解析模板。整体上说该框架只是在express搭建了一层mvc实现方式。那么myweb框架给开发者带来了什么便利呢?<br/> 二、myweb框架带来的便利<br/> 1、 MVC开发模式<br/> 在PHP开发中我们经常会应用MVC设计模式开发出一套框架,而NodeJs在现发展初期,还没有比较成熟的MVC开发框架,大部分都是通过自我根据express框架进行搭建。本框架也属于个人搭建的MVC框架。该框架很适合PHP开发者,因为本人也是一个PHP和JavaScript开发者,因此主要是借鉴PHP的MVC模式来搭建该框架。<br/> 2、 路由处理<br/> 路由处理是框架的一个基本的也是关键的部分,路由处理的方式直接影响到url的显示方式。 本框架路由经历了两个过程:<br/> a、 直接通过key值来判断用户请求的资源,例如:<br/> http://127.0.0.1:3000/index,这个请求我们利用express获取key值index,然后读取配置文件信息
index{file:’index_controller’,class:’indexController’,function:’loginAct’}
<br/>
从而我们根据index值得到了所有的controller和action,那么我们如何去访问这个action呢(这部分写在文档最后技术实现)?<br/> b、 第一种方式,不知道大家是否会发现一个问题。当我们有300个action时(很正常),我们需要写入300条记录到一个配置文件中,这样会导致配置文件越来越繁重。因此就出现第二种路由处理方式:<br/>
http://127.0.0.1:3000/index?c=login
根据index获取当前的controller,根据c的参数获取当前需要访问的action,这样 我们的一个controller只对应一个配置信息。从而减少读取配置文件的时间。<br/> 3、 数据库链接<br/> 本框架只提供了一种链接mysql的方式,希望在后期能够提供更多的数据库链接。链接mysql数据库的方式,这里就不需要细讲,大家可以通过github上查找node mysql学习资源。<br/> 本框架封装了一些基本的数据库操作从而减少开发者开发时间,只需要通过add、update、delete、query、select简单粗暴的去执行。<br/> 4、 日志处理<br/> 本框架实现了一个自我的日志记录处理功能,主要是便于系统运营。<br/> 其中的日志设定:错误、警告、流水记录,同时可以设定日志错误级别,以便系统出错时即时的定位。<br/> 5、 邮件发送功能<br/> 这个功能没有做进一步的封装,只是利用了他人的库进行配置,之后会做进一步封装。<br/> 6、 您只需要一步就可以实现本系统运行,下载该框架代码,执行node index.js就可以运行本框架(如果使用到session登录请下载redis-server.exe,去github下载)。<br/> 三、技术实现细节<br/> 之前有发表过一篇文章<a href=‘http://cnodejs.org/topic/4fbae8b4d46624c476078480’>《如何一体化一个NodeJs的MVC开发框架》</a>里面有涉及到大部分该框架的开发技术细节。这里我只介绍如何new一个controller同时,访问对象的一个action的方式<br/> Nodejs不像PHP有一个call_function函数可以执行访问对象中的某个方法名函数。<br/> 我们需要以下要求和需要解决的问题:<br/> 1、 因为express中的req和res是必须要贯穿整个系统的,因此我们必须把这两个参数作为基类的变量,以便继承类中可以随时的调用;<br/> 2、 如何new一个字符串的controller,也就是给你一个controller字符串名,然后你需要去new这个名为controller的对象;<br/> 3、 如何访问一个对象的function(注意:这个function名是一个字符串)<br/> 针对以上三个问题我们做如何解决:<br/> 1、 我们可以定义一个init构造函数<br/>
controllerObj.init(req, res)
2、 利用JavaScript中的eval<br/> 例如:<br/>
var controllerObj = eval("new " +className)
3、 利用JavaScript中的call方法<br/>
controllerObj[functionName].call();
最新代码地址:<a href=‘https://github.com/tnodejs/myweb-nodejs’>https://github.com/tnodejs/myweb-nodejs</a><br/> 我的菜鸟论坛:<a href=‘http://www.tnodejs.com’>www.tnodejs.com</a> <a href=‘http://tnodejs.com’>tnodejs.com</a><br/> ——————————————————————————————————<br/> 你赋予人生何种意义,他就是何种意义<br/> ——————————————————————————————————<br/>
if(life.wantToBe == 'fish'){
your.career = 'fish';
} else {
your.career = 'not fish';
}
console.log("Anyway you must believe yourself!");
var controllerObj = eval("new " +className);
这个 直接 new ClassName() 就可以吧
controller 做成 module var Controller = require(controller_path); var ctrl = new Controller;
可以么~似乎是不行的~因为那个className是一个字符串!你可以去试试
function test(){}
var mm = new 'test';
@huangdh3 controller 做成 module var Controller = require(controller_path); var ctrl = new Controller;
@blue5tar 这样是ok的~不过在考虑到继承的原因,controller没有使用module形式!
@huangdh3 module 也可以继承啊 还有你controller 这个类 方法都写到构造函数里面 每次 new的时候 都初始这些方法也不好
@blue5tar 嗯~说的对~很有道理~谢谢提醒!嘿嘿!
PHP 真的就那么好,要把那套拿到 NodeJS 中。
难道使用 NodeJS + Javascript 不应该做出出更佳的设计吗?