一个NodeJS写的基于MVC的服务器
目前实现了静态文件下载、根据地址导航到控制器相应的控制器方法,但视图模版功能目前还未实现。
服务器代码(httpserver.js):
var http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs"),
getContentType=function(type){
var type=type.indexOf(".")===0 ? type.substr(1) : type,
defType="application/octet-stream",
types={
html:"text/html",
js:"text/javascript",
css:"text/css",
gif:"image/gif",
jpg:"image/jpeg",
png:"image/png",
};
return typeof(types[type])!="undefined" ? types[type] : defType;
}; http.createServer(function(req, res) {
var pathname=url.parse(req.url).pathname;
if(pathname=="/"){
pathname+="index.html";
}
pathname=__dirname+pathname;
console.log(req.url); if(req.url.match(/^\/controller\//) || req.url.match(/^\/data\//)){ //禁止访问目录
res.writeHead(404, {"Content-Type" : "text/html"});
}else if(req.url.match(/^\/\w+\/\w+(\?.*)?$/)){ //控制器输出
var u=url.parse(req.url),
ca=u.pathname.substr(1).split("/"),
c=ca[0],a=ca[1],
cpath=__dirname + "/controller/"+c+".js",
controller;
if(fs.existsSync(cpath)){
res.writeHead(200, {"Content-Type" : getContentType("html")});
controller=require(cpath);
if(typeof(controller[a])!="undefined"){
controller[a](res,u);
}
//delete require.cache[cpath]; //是否清空脚本缓存
}else{
res.writeHead(200, {"Content-Type" : getContentType("html")});
res.end(path+" not exists!");
}
}else if(fs.existsSync(pathname)){//静态文件输出
res.writeHead(200, {"Content-Type" : getContentType(path.extname(pathname))});
fs.readFile(pathname, function(err, data) {
res.end(data);
});
}else{
res.writeHead(404, {
"Content-Type" : getContentType("html")
});
res.end("<h1>404 Not Found</h1>");
} }).listen(8080, "127.0.0.1"); console.log("Server running at http://127.0.0.1:8080/");
控制器代码(controller/project.js):
var tm=1,
mysql=require("mysql"),
conn = mysql.createConnection({
host: '127.0.0.1',
user: 'root',
password: '123456',
database:'dbname',
port: 3306
});
conn.connect(); var project={
show:function(res,url){
var paras={},tb="user";
console.log(url.query);
if(typeof(url.query)=="string"){
var ps=url.query.split("&"),pss;
for(var k in ps){
pss=ps[k].split("=");
paras[pss[0]]=pss[1];
}
}
res.write((tm++)+"<br/>"); conn.query(
'SELECT * from prefx_'+(typeof(paras.tb)!="undefined" ? paras.tb : tb )+' limit 0,3',
function(err, results, fields){
var field="",str="",fds=[];
if (results) {
for(var k in fields){
fds.push(fields[k]['name']);
}
for ( var i = 0; i < results.length; i++) {
str="";
for(var k in fds){
str+=results[i][fds[k]]+"\t";
}
res.write(str+"<br/>");
}
}
res.end("<br/>"+(new Date()).getTime());
}
);
}
} module.exports=project;
网站目录结构如下:
例如访问:http://127.0.0.1:8080/project/show,则访问project控制器中show方法
一个NodeJS写的基于MVC的服务器的更多相关文章
- 分享一个nodejs写的小论坛
引言:作为一个前端小菜鸟,最近迷上了node,于是乎空闲时间,为了练练手写了一个node的小社区,关于微信小程序的,欢迎大家批评指导. 项目架构部分 一.前端架构 作为一个写样式也得无聊的前端狮,我偷 ...
- 分享一个以前写的基于C#语言操作数据库的小框架
一:前言 这个是以前写的操作MySQL数据库的小型框架,如果是中小型项目用起来也是很不错的,里面提供Filter.ModelPart.Relationship等机制实现操作数据库时的SQL语句的拼接和 ...
- 分享一个自己写的基于TP的关系模型
为了说明问题,假设现在有表test1,test1有从表test2:test1属于test3,test1和test4多对多,关联表test1_test4. 1.定义关系 class Test1Model ...
- 分享一个自己写的基于JQuery的一个Web背景切换的Demo
这个效果主要有两个特点: 1. 背景切换的渐变 2. 背景大小自适应 3. 背景自适应保持比例同时, 相对居中 js源码: (function ($) { $.fn.bgChange = functi ...
- 分享一个自己写的基于canvas的原生js图片爆炸插件
DEMO访问地址: https://bupt-hjm.github.io/BoomGo/博客地址: http://bupt-hjm.github.io/2016/07/10/boom/插件及使用方法地 ...
- 分享一个自己写的基于TP的关系模型(四)
修复分页BUG,原有代码查询到最后一页就一只查询最后一页 $ ? $; $this->maxPage = ceil($this->total/$this->rows); //$thi ...
- 分享一个自己写的基于TP的关系模型(三)
这段时间对模型做了升级和优化,并将版本更新到TP3.2. 下载 下载后请将目录放置TP的Library目录下 1.数据节点优化,原来的节点为模型的名称或者表名,现在更新为定义关系的方法名 public ...
- 分享一个自己写的基于TP的关系模型(2)
1.增加多对多关系的处理 /** * 定义关系 * @return array */ public function test4(){ //参数说明 //关联的模型 //主表关联字段 //关联中间表 ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
随机推荐
- AppCompatActivity
刚开始看HelloWorld的目录结构然后就发现Android Studio中的是 import android support.v7.app.AppcompatActivity; public cl ...
- Linux网络编程简单示例
linux 网络编程是通过socket(套接字)接口实现,Socket是一种文件描述符,socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭& ...
- 把握linux内核设计思想(十二):内存管理之slab分配器
[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流.请勿用于商业用途] 上一节最后说到对于小内存区的请求,假设採用伙伴系统来进行分配,则会在页内产生非 ...
- 关于android 使用bitmap的OOM心得和解决方式
android开发,从2010年開始学习到如今的独立完毕一个app,这漫长的四年,已经经历了非常多次bug的折磨.无数次的加班训练.然而,自以为自己已经比較了解android了,却近期在一个项目上.由 ...
- 仿htc sense的弹性listView!
demo下载:http://pan.baidu.com/s/1ntoICdV 前一段时间换了htc m7之后,对htc的sense ui有不错的印象.特别是它的listview十分有个性.提供弹性的o ...
- 第一个MapReduce程序——WordCount
通常我们在学习一门语言的时候,写的第一个程序就是Hello World.而在学习Hadoop时,我们要写的第一个程序就是词频统计WordCount程序. 一.MapReduce简介 1.1 MapRe ...
- Python正則表達式:怎样使用正則表達式
正則表達式(简称RE)本质上能够看作一个小的.高度专业化的编程语言,在Python中能够通过re模块使用它.使用正則表達式,你须要为想要匹配的字符串集合指定一套规则,字符串集合能够包括英文句子.e-m ...
- linux centos7 安装常用软件java,node,mysql,Seafile
linux centos7 安装常用软件java,node,mysql,Seafile 安装压缩解压缩软件 yum install -y unzip zip 安装git yum install -y ...
- BootStrap-DualListBox怎样改造成为双树
BootStrap-DualListBox能够实现将所选择的列表项显示到右边,未选的列表项显示到左边. 但是左右两边的下拉框中都是单级列表.如果要实现将两边都是树(缩进树),选择某个节点时,其子节点也 ...
- jetty java文件无法删除 java文件占用 delete无效 运行时锁定静态资源的解决方法
前几天jetty下发现java无法删除文件,文件操作后一直被jvm占用,无奈换了tomcat问题消失. 今天又想起来,尝试网上的解决方法,经本人试验,直接修改配置文件有时不能生效,具体原因不清楚,建议 ...