mvc会针对请求进行分发,分发一般有controller(针对模块),action(针对模块中的方法),args(请求的参数)。

1.先对http请求的url进行设置,解析url中的各种参数:

//config.js

var route = require('./route');

//针对ajax请求

route.map({

method:'get',

url:/^\/category/mailCategory/i,

controller:'mailCategory',

action:'getMailCategory'});

//controller为空,针对页面,针对页面

route.map({

method:'get',

url:/^\/$/i,

controller:'',

action:'list.html'});

server.js的入口:

exports.runServer = function(port){

port= port || 10088;/*function(req,res){}它将会自动加入到 'request' 事件的监听队列。

它是http.IncomingMessage的一个实例。*/

var server = http.createServer(function(req, res){var _postData = '';//on用于添加一个监听函数到一个特定的事件

req.on('data', function(chunk)

{

_postData+=chunk;

})

.on('end', function()

{

req.post=querystring.parse(_postData);

handlerRequest(req, res);

});

}).listen(port); //程序运行的入口

console.log('Server running at http://180.150.189.25:'+ 10088 +'/');

};

当接收完请求的URL之后,执行handlerRequest(req, res);

/**

* 所有请求的统一入口*/

var handlerRequest = function(req, res){//通过route来获取controller和action信息

var actionInfo =route.getActionInfo(req.url, req.method);//如果route中有匹配的action,则分发给对应的action

if(actionInfo.action){var controller =actionInfo.controller;//直接跳转页面

if(controller == ""){

viewEngine.forward(req, res, actionInfo.action);return;

}//加载action

if(controller[actionInfo.action]){var ct = newcontrollerContext(req, res);//如果是post请求,从重新设置参数

if(req.method.toLowerCase() == "post"){

actionInfo.args=req.post;

}//通过apply将controller的上下文对象传递给action,路径转化就在这里。

controller[actionInfo.action].call(ct, actionInfo.args);

}else{

handler500(req, res,'Error: controller "' + actionInfo.controller + '" without action "' + actionInfo.action + '"')

}

}else{//如果route没有匹配到,则当作静态文件处理

staticFileServer(req, res);

}

};

viewEngine.forward代码如下:

var staticFileServer = function(req, res, filePath){if(!filePath){

filePath=path.join(__dirname, config.staticFileDir, url.parse(req.url).pathname);

}

fs.exists(filePath,function(exists) {if(!exists) {//目录不存在的情况

handler404(req, res);return;

}var raw =fs.createReadStream(filePath);var ext =path.extname(filePath);

ext= ext ? ext.slice(1) : 'html';var acceptEncoding = req.headers['accept-encoding'];var head = {'Content-Type': contentTypes[ext] || 'text/html'};if (!acceptEncoding) {

acceptEncoding= '';

}//根据请求头部信息,返回相应的数据

if(acceptEncoding.match(/\bgzip\b/)) {

head["content-encoding"] = "gzip";

res.writeHead(200, head);

raw.pipe(zlib.createGzip()).pipe(res);

}else if (acceptEncoding.match(/\bdeflate\b/)) {

head["content-encoding"] = "deflate";

res.writeHead(200, head);

raw.pipe(zlib.createDeflate()).pipe(res);

}else{

res.writeHead(200, head);

raw.pipe(res);

}

});

};

ct的上下文如下:

//controller的上下文对象

var controllerContext = function(req, res){this.req =req;this.res =res;this.dbPool =dbPool;this.contextPath =__dirname;this.handler404 =handler404;this.handler500 =handler500;

};

2.controller

通过上面的转发就可以把URL与module中的方法映射起来,我们写方法就可以按照模块来写了,例如mailCategory中的getMailCategory的方法如下:

在src模块中的action模块的MailCategory.js中:

/*MailCategory.js,提供两个action

getMailList 和 getMailCategory*/exports.getMailList= function(args){var context = this;var result = {errCode: 0, msg: 'success', categoryId: categoryId, data:[]};//参数校验

var categoryId =args.categoryId;if(!categoryId){

emitter.emit("invalidCategoryId", result, context);return false;

}/**

* 获取邮件栏目信息

* @param isList 1 只是返回栏目列表 0 返回栏目及模块信息

* @returns {errCode:0, msg:'success', data:[{id:'', name: '', alias: ''},...]}

* @returns {errCode:0, msg:'success', data: [{id:'', name:'', alias:'', modules:[{id:'', name:''}, ...]}]}*/exports.getMailCategory= function(args){

}

3.module

为controller层提供数据,直接与数据库连接,或者中间加一道缓存,例如redis。刚刚看到在映射的过程中,传递对象的成员

this.dbPool =dbPool;

它的定义如下:

dbManager = require('./src/utilities/DbManager');//数据库链接池

var dbPool = dbManager.getPool();

DbManager.js封装了连接数据库,或者一个连接池的对象

//创建mysql数据库链接

var mysql = require('mysql');//连接池

var dbConfig ={

host:'180.150.189.25',

port:'3306',

user:'iyy',

password:'iyy@2015',

database:'anthony',

connectionLimit:20 //连接池最大连接数

//waitForConnections: false

}//从数据库获取一个链接

exports.getConnection = function(){returnmysql.createConnection(dbConfig);

}

exports.getPool= function(){var pool =mysql.createPool(dbConfig);returnpool;

}

这样就可以在controller模块中直接操作数据库,如下:

context.dbPool.getConnection(function(err,connection){if(err){

emitter.emit("connectFailed", result, context);return false;

}//可以进一步拆分到module中。

connection.query("delete from MailModule where id="+intDeleteId,function(err,res){if(err) {

emitter.emit("queryFailed", result, context);return false;

}/*emitter.on("success", function(result, context){

result.errCode = 0;

result.msg = "success";

var str='updateuserinfo_callback({"ret":2,"errmsg":"asdas"})';

context.renderJson(str);

});*/emitter.emit("success", result, context);

});//释放链接

connection.end();

});

nodejs mysql mvc_一种nodejs的MVC框架相关推荐

  1. nodejs mysql事务处理_关于NodeJs如何使用Mysql模块实现事务处理实例

    本篇文章主要介绍了NodeJs使用Mysql模块实现事务处理 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 依赖模块: 1. mysqlnpm install mysq ...

  2. nodejs mysql 创建连接池

    用Nodejs连接MySQL 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javas ...

  3. 了解MVC模式与MVC框架

    MVC MVC的概念 模型(Model) 控制器(Controller) 视图(View) MVC工作流程 Java MVC框架 Struts1框架 Struts2框架 Spring MVC框架 JS ...

  4. React+Nodejs+MySQL全栈开发入门

    内容介绍 1.开发环境准备 安装Nodejs 第一个Nodejs程序 Nodejs和npm nodemon实现热启动 使用nrm解决npm源的 使用nvm管理Nodejs版本 2.Web应用基础 We ...

  5. 服务器nodejs连接mysql_《使用nodejs连接mysql数据库》

    上边我们熟悉了如何用docker拉取远程的mysql,以及进入这个数据库然后连接.并且在命令行操作数据库,比如查看,或者操作数据库中的表. 也可以用node js操作数据库.只不过node的原生模块里 ...

  6. nodejs mysql数据推送_使用Nodejs实现实时推送MySQL数据库最新信息到客户端

    下面我们要做的就是把MySQL这边一张表数据的更新实时的推送到客户端,比如MySQL这边表的数据abc变成123了,那使用程序就会把最新的123推送到每一个连接到服务器的客户端.如果服务器的连接的客户 ...

  7. centos搭建mysql、nginx、nodejs、screen

    从零开始配置centos服务器(mysql,nginx,nodejs,screen) 前言 需要的环境 mysql,node,nginx 一 centos系统源更新 yum update 二 安装上传 ...

  8. nodeJS+mysql+连接池——连接池的创建和使用

    nodeJS+mysql+连接池--连接池的创建和使用 https://www.cnblogs.com/shenlonghun/p/6133963.html 介绍 在 软件工程 , 连接池 是一个 高 ...

  9. nodejs mysql更新redis_node中的redis使用--ioredis

    nodejs 链接 redis/mysql 连接池 redis是单线程作业,所以不管查询任务是由一个链接发来的还是多个链接发来的,redis是串行的执行.并通过当前的链接返回客户端.nodejs接受r ...

最新文章

  1. 大数据如何改变商业管理
  2. [Sensor]--BMI160-加速度计、陀螺仪传感器
  3. oracle计算最大与最小之间数,oracle 分析函数
  4. 前端学习(1165):扩展运算符01
  5. 我的Linux折腾史
  6. php查询排序,php如何对查询结果集进行排序
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的学籍管理系统
  8. 吴恩达深度学习4.2练习_Convolutional Neural Networks_the Happy House(Keras)
  9. 转换运行时获取DTP语义组
  10. 使用HTML5的语义标签
  11. CSS世界Bug般的存在——字母x与“居中”
  12. 常见的VPS主机运维面板汇总—网站运维面板
  13. 如何下载msdn上面的操作系统镜像
  14. 阿里巴巴大数据竞赛-天池
  15. 把一个代表DateTime带有T和Z的string转化成DateTime c#
  16. ChemDraw19激活中文版下载化学绘图软件教程
  17. iPhone开发 - 3D - 建立3D界面(上)
  18. Linux磁盘与文件系统管理
  19. Xmap的NullPointerException
  20. 小满 | 清和暑夏,小得盈满

热门文章

  1. html语言标示,HTML语言剖析(二) HTML标记一览
  2. java webservice 接收数据_WebService客户端,接收数据解析存入数据库
  3. 初创企通过哪里报名可参与赛事活动
  4. 说说我心中的Linux系统
  5. Android开源框架源码鉴赏:LruCache与DiskLruCache
  6. 支配计算领域44年之后,摩尔定律的下一步该往哪里走?
  7. MySQL 如何实现行转列分级输出?
  8. Windows Server 2008 R2/2012 网络负载平衡NLB相关内容
  9. 用Linux命令行实现删除和复制指定类型的文件
  10. 错误提示:ssh: Could not resolve hostname devsrv: Name or service not known