nodejs mysql mvc_一种nodejs的MVC框架
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框架相关推荐
- nodejs mysql事务处理_关于NodeJs如何使用Mysql模块实现事务处理实例
本篇文章主要介绍了NodeJs使用Mysql模块实现事务处理 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 依赖模块: 1. mysqlnpm install mysq ...
- nodejs mysql 创建连接池
用Nodejs连接MySQL 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javas ...
- 了解MVC模式与MVC框架
MVC MVC的概念 模型(Model) 控制器(Controller) 视图(View) MVC工作流程 Java MVC框架 Struts1框架 Struts2框架 Spring MVC框架 JS ...
- React+Nodejs+MySQL全栈开发入门
内容介绍 1.开发环境准备 安装Nodejs 第一个Nodejs程序 Nodejs和npm nodemon实现热启动 使用nrm解决npm源的 使用nvm管理Nodejs版本 2.Web应用基础 We ...
- 服务器nodejs连接mysql_《使用nodejs连接mysql数据库》
上边我们熟悉了如何用docker拉取远程的mysql,以及进入这个数据库然后连接.并且在命令行操作数据库,比如查看,或者操作数据库中的表. 也可以用node js操作数据库.只不过node的原生模块里 ...
- nodejs mysql数据推送_使用Nodejs实现实时推送MySQL数据库最新信息到客户端
下面我们要做的就是把MySQL这边一张表数据的更新实时的推送到客户端,比如MySQL这边表的数据abc变成123了,那使用程序就会把最新的123推送到每一个连接到服务器的客户端.如果服务器的连接的客户 ...
- centos搭建mysql、nginx、nodejs、screen
从零开始配置centos服务器(mysql,nginx,nodejs,screen) 前言 需要的环境 mysql,node,nginx 一 centos系统源更新 yum update 二 安装上传 ...
- nodeJS+mysql+连接池——连接池的创建和使用
nodeJS+mysql+连接池--连接池的创建和使用 https://www.cnblogs.com/shenlonghun/p/6133963.html 介绍 在 软件工程 , 连接池 是一个 高 ...
- nodejs mysql更新redis_node中的redis使用--ioredis
nodejs 链接 redis/mysql 连接池 redis是单线程作业,所以不管查询任务是由一个链接发来的还是多个链接发来的,redis是串行的执行.并通过当前的链接返回客户端.nodejs接受r ...
最新文章
- 大数据如何改变商业管理
- [Sensor]--BMI160-加速度计、陀螺仪传感器
- oracle计算最大与最小之间数,oracle 分析函数
- 前端学习(1165):扩展运算符01
- 我的Linux折腾史
- php查询排序,php如何对查询结果集进行排序
- 基于JAVA+SpringMVC+Mybatis+MYSQL的学籍管理系统
- 吴恩达深度学习4.2练习_Convolutional Neural Networks_the Happy House(Keras)
- 转换运行时获取DTP语义组
- 使用HTML5的语义标签
- CSS世界Bug般的存在——字母x与“居中”
- 常见的VPS主机运维面板汇总—网站运维面板
- 如何下载msdn上面的操作系统镜像
- 阿里巴巴大数据竞赛-天池
- 把一个代表DateTime带有T和Z的string转化成DateTime c#
- ChemDraw19激活中文版下载化学绘图软件教程
- iPhone开发 - 3D - 建立3D界面(上)
- Linux磁盘与文件系统管理
- Xmap的NullPointerException
- 小满 | 清和暑夏,小得盈满
热门文章
- html语言标示,HTML语言剖析(二) HTML标记一览
- java webservice 接收数据_WebService客户端,接收数据解析存入数据库
- 初创企通过哪里报名可参与赛事活动
- 说说我心中的Linux系统
- Android开源框架源码鉴赏:LruCache与DiskLruCache
- 支配计算领域44年之后,摩尔定律的下一步该往哪里走?
- MySQL 如何实现行转列分级输出?
- Windows Server 2008 R2/2012 网络负载平衡NLB相关内容
- 用Linux命令行实现删除和复制指定类型的文件
- 错误提示:ssh: Could not resolve hostname devsrv: Name or service not known