之前写的新闻部分几乎所有操作都写在了一起,这次开始进行模块化。

为什么要模块化:

1.提高开发效率,所有操作在一个文件内,不方便团队操作,模块化可多人同时操作

2.当程序出错,可以分模块寻找错误

3.可以使程序不一次性全部展示出来,保留一些操作不可见

模块化步骤:

1.思考,该模块中要封装什么代码?

2.思考,这些代码有用到什么外部数据?如果用到了该如何传递
3.当前模块对外需要暴露的东西(moudule.eports的值)

原代码:

var http=require('http');
var fs=require('fs');
var path=require('path');
var mime=require('mime');
var url=require('url');
var querystring=require('querystring');
var _=require('underscore'); http.createServer(function(req,res){ res.render=function(filename,tqData){
fs.readFile(filename,function(err,data){
if(err)
{
res.writeHead(404,'Not Found',{'Content-Type':'text/html;charset=utf-8'});
res.end('44,not found');
return;
}
if(tqData){
var fn=_.template(data.toString('utf8'));
data=fn(tqData); }
res.end(data);
}) } req.url=req.url.toLowerCase();
req.method=req.method.toLowerCase(); var urlObj=url.parse(req.url,true); if(req.url==='/'||req.url==='/index'&&req.method==='get')
{
readNewsData(function(list){
res.render(path.join(__dirname,'views','home.html'),{list:list});
}) }else if(req.url==='/submit'&&req.method==='get'){ res.render(path.join(__dirname,'views','submit.html')); }else if(urlObj.pathname==='/item'&&req.method==='get'){ readNewsData(function(list){ for(var i=0;i<list.length;i++)
{ if(list[i].id.toString()===urlObj.query.id)
{
model=list[i];
break; }
}
if(model)
{
res.render(path.join(__dirname,'views','details.html'),{item:model});
}
else
{
res.end('no found')
}
}) }else if(req.url.startsWith('/add')&&req.method==='get'){ fs.readFile(path.join(__dirname,'data','data1.json'),'utf8',function(err,data){
if(err&&err.code!=='ENOENT'){
throw err;
}
var list_news=JSON.parse(data||'[]'); }); }else if(req.url.startsWith('/add')&&req.method==='post'){ readNewsData(function(list_news){ postBodyData(req,function(postBody){ postBody.id=list_news.length;
list_news.push(postBody); writeNewsData(JSON.stringify(list_news),function(){
res.statusCode=302;
res.statusMessage='Found';
res.setHeader('Location','/');
res.end('over'); });
});
}); }else if(req.url.startsWith('/resource')&&req.method==='get'){ res.render(path.join(__dirname,req.url)); }
else{
res.writeHead(404,'NOT FOUND',{
'Content-Type':'text/plain;charset=utf-8'
});
res.end('404,page not found');
}
}).listen(9090,function(){
console.log('http://localhost:9090');
}) function readNewsData(callback){
fs.readFile(path.join(__dirname,'data','data1.json'),'utf8',function(err,data){
if(err&&err.code!=='ENOENT'){
throw err;
} var list_news=JSON.parse(data||'[]');
//通过回调函数callback()将读取到的数据list,传递出去
callback(list_news);
});
} function writeNewsData(data,callback){
fs.writeFile(path.join(__dirname,'data','data1.json'),data,function(err){
if(err){
throw err;
}
console.log('ok');
}); callback();
} function postBodyData(req,callback){ var array=[];
req.on('data',function(chunk){
array.push(chunk); }); req.on('end',function(){
var postBody=Buffer.concat(array);
postBody=postBody.toString('utf8'); postBody=querystring.parse(postBody); callback(postBody);
});
}

模块化部分:

模块一(服务模块):负责启动服务
模块二(扩展模块):负责扩展req和res对象,为res和res对象,为req和res增加以下更方便更好用的API
模块三(路由模块):负责路由判断
模块四(业务模块):负责处理具体路由的业务的代码

模块一(index.js)

代码:

 var http=require('http');
var context=require('./context.js');
var router=require('./router.js');
var handler=require('./handler.js'); http.createServer(function(req,res){
//调用context.js模块的返回值(函数),并将req和res对象传递给context.js模块
context(req,res);
//调用路由模块返回值
router(req,res); }).listen(9090,function(){
console.log('http://localhost:9090');
})

模块二(context.js)

负责扩展req和res对象,为res和res对象,为req和res增加以下更方便更好用的API
希望在该模块做:
1.为req增加一个query熟悉,该属性中保存的就是用户get请求提交过来的数据
-req.query
2.为req增加一个pathname属性
-req.pathname
3.为res增加一个render函数

代码:

var http=require('http');
var fs=require('fs');
var path=require('path');
var mime=require('mime');
var url=require('url');
var querystring=require('querystring');
var _=require('underscore'); //让当前模块对外暴露一个函数,通过这个函数将res,req传入模块中
module.exports=function(req,res){ //1.为req增加query属性
var urlObj=url.parse(req.url.toLowerCase(),true);
req.query=urlObj.query;
//2.为req增加pathname属性
req.pathname=urlObj.pathname;
//3.为req增加method属性
req.method=req.method.toLowerCase(); //3.为res增加函数
res.render=function(filename,tqData){
fs.readFile(filename,function(err,data){
if(err)
{
res.writeHead(404,'Not Found',{'Content-Type':'text/html;charset=utf-8'});
res.end('44,not found');
return;
}
if(tqData){
var fn=_.template(data.toString('utf8'));
data=fn(tqData); }
res.end(data);
});
}; };

模块三(router.js)

该模块负责封装所以路由判断代码

代码:

 //该模块负责封装所以路由判断代码

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

 module.exports = function(req,res){
if(req.url==='/'||req.url==='/index'&&req.method==='get')
{
handler.index(req,res); }else if(req.pathname==='/submit'&&req.method==='get'){
handler.submit(req,res); }else if(req.pathname==='/item'&&req.method==='get'){
handler.item(req,res); }else if(req.url.startsWith('/add')&&req.method==='post'){
handler.add(req,res); }else if(req.url.startsWith('/resource')&&req.method==='get'){
handler.resource(req,res); }
else{
handler.nofound(req,res);
}
}

模块四(handler.js)

该模块负责对具体的业务进行处理

代码:

 //该模块负责对具体的业务进行处理
var path=require('path');
var fs=require('fs');
var querystring=require('querystring'); module.exports.index=function(req,res){
if(req.pathname==='/'||req.url==='/index'&&req.method==='get')
{
readNewsData(function(list){
res.render(path.join(__dirname,'views','home.html'),{list:list});
})
}} module.exports.submit=function(req,res){
res.render(path.join(__dirname,'views','submit.html'));
} module.exports.item=function(req,res){
readNewsData(function(list){ for(var i=0;i<list.length;i++)
{ if(list[i].id.toString()===req.query.id)
{
model=list[i];
break; }
}
if(model)
{
res.render(path.join(__dirname,'views','details.html'),{item:model});
}
else
{
res.end('no found')
}
}) } module.exports.add=function(req,res){
//1.读取data1.json
readNewsData(function(list_news){
//2.读取用户post提交的数据
postBodyData(req,function(postBody){
//3.为用户提交的新闻增加一个id属性,并且把新闻对象push到list中
postBody.id=list_news.length;
list_news.push(postBody);
//将list数组写入到data1.json中
writeNewsData(JSON.stringify(list_news),function(){
res.statusCode=302;
res.statusMessage='Found';
res.setHeader('Location','/');
res.end('over'); });
});
}); } module.exports.resource=function(req,res){
res.render(path.join(__dirname,req.pathname));
} module.exports.nofound=function(req,res){
res.writeHead(404,'NOT FOUND',{
'Content-Type':'text/plain;charset=utf-8'
});
res.end('404,page not found');
} function readNewsData(callback){
fs.readFile(path.join(__dirname,'data','data1.json'),'utf8',function(err,data){
if(err&&err.code!=='ENOENT'){
throw err;
} var list_news=JSON.parse(data||'[]');
//通过回调函数callback()将读取到的数据list,传递出去
callback(list_news);
});
} function writeNewsData(data,callback){
fs.writeFile(path.join(__dirname,'data','data1.json'),data,function(err){
if(err){
throw err;
}
console.log('ok');
}); //这里写当写入数据完毕后的操作
callback();
} function postBodyData(req,callback){ var array=[];
req.on('data',function(chunk){
array.push(chunk);
//
}); req.on('end',function(){
var postBody=Buffer.concat(array);
postBody=postBody.toString('utf8'); postBody=querystring.parse(postBody); callback(postBody);
});
}

执行顺序

index.js文件从上往下执行,先加载context,在加载router,由于router文件内要先加载handler,所以handler顺序比router前面点,之后就开始监听9090端口,当有了请求后就执行http内部的代码了。

node——模块化的更多相关文章

  1. Node入门教程(6)第五章:node 模块化(上)模块化演进

    node 模块化 JS 诞生的时候,仅仅是为了实现网页表单的本地校验和简单的 dom 操作处理.所以并没有模块化的规范设计. 项目小的时候,我们可以通过命名空间.局部作用域.自执行函数等手段实现变量不 ...

  2. Node模块化

    Node.js是一个能够在服务器端运行JavaScript的开放源代码.跨平台JavaScript运行环境.Node是对ES标准一个实现,也是一个JS引擎.与传统服务器不同是Node的服务器是单线程的 ...

  3. Node入门教程(7)第五章:node 模块化(下) npm与yarn详解

    Node的包管理器 JavaScript缺少包结构的定义,而CommonJS定义了一系列的规范.而NPM的出现则是为了在CommonJS规范的基础上,实现解决包的安装卸载,依赖管理,版本管理等问题. ...

  4. node模块化开发基本知识学习笔记

    传统非模块化开发缺点: 1.命名冲突 2.文件依赖 标准的模块化规范: 1.AMD-requirejs 2.CMD-seajs 服务器端模块化规范: 1.CommonJS-Node.js 模块化相关的 ...

  5. node 模块化思想中index.js的重要性

    目录结构如上图 module1和modlue2.main在同一级 module1下文件: index.js var test2=require('./test2'); var sayHi=functi ...

  6. 初学node node开发环境搭建 node模块化 commonJS原理

    由于Node.js平台是在后端运行JavaScript代码,所以,必须首先在本机安装Node环境. 学习node,首先要装node,和它的包管理工具,这两个都是傻瓜式安装,百度一下就安装了. 安装完之 ...

  7. 19 — node 模块化 及 CommonJS规范 — CommonJS 的由来及各组织与 JS 的关系

    ECMAScript  对于不同的环境(运行平台),设计结构,理念,使用方式大相径庭. 1,浏览器 :DOM BOM 2,NodeJS :FS,HTTP 内置模块 :  第三方模块 : 内置模块 3, ...

  8. Node六-模块化

    Node实现CommonJS规范 -因此node可以使用模块化的方式组织代码结构 简单命令行加减运算 -代码 命令行执行 V8对es6的支持 -直接支持:const.模版字符串等. -严格模式支持:l ...

  9. JS 模块化和打包方案收集

    1.这里想讨论的是拆分规则,不是在问哪个工具怎么使用.2.这里没有在想找正确答案,因为感觉这个问题要结合具体业务场景. 随着项目开发越来越大,一开始代码全打包到一个文件的方式,让文件越来越大,接下来要 ...

随机推荐

  1. 5G的前景以及意义

    首先来介绍一下5G:5G网络是第五代移动通信网络,其峰值理论传输速度可达每8秒1GB,比4G网络的传输速度快数百倍.举例来说,一部1G的电影可在8秒之内下载完成. 5G的技术原理是:三星电子通过研究和 ...

  2. Spring 单例模式和多例模式

    1.Spring中的对象默认都是 单例模式. 2.使用 @Scope("prototype") 注解来使对象成为多例模式. 3.通过@Autowired 注入的Service 或者 ...

  3. ISAP 算法的学习

    http://www.renfei.org/blog/isap.html 算法与数学 网络流-最大流问题 ISAP 算法解释 2013-08-07Renfei Song 2 条评论 内容提要 [隐藏] ...

  4. Django(七)

    一.ModelForm操作及验证 1.class Meta:class Meta: #注意以下字段不能加逗号 model = models.UserInfo #这里的all代指所用的字段,也可以是一个 ...

  5. 淘宝内部分享:MySQL & MariaDB性能优化

    发表于2015-01-20 16:26| 28875次阅读| 来源mysql.taobao.org| 22 条评论| 作者淘宝数据库团队 MySQL性能优化淘宝数据库 摘要:MySQL是目前使用最多的 ...

  6. 不错的题目-n个数连接得到的最大值

    这道题目还是很不错的 <[字符串排序]n个数连接得到最小或最大的多位整数> 题目 描述:设有n个正整数,将它们依次连成在一排,组成一个多位数,现在要求可能组成的多位数中最大的多位数是什么? ...

  7. 【JMeter连接SQLServer】採用window鉴权方式连接(原创)

    大家都知道Jmeter能够连接各种数据库.这方面我也不多说了,假设你还不知道怎么连接的话.能够參看我看的另外一篇博文.这边有具体的介绍 http://blog.csdn.net/lzqinfen/ar ...

  8. Jquery-Uncaught ReferenceError: $ is not defined报错

    在我的jsp页面上有这些js代码: //载入数据 $(document).ready(function() { var param={}; param.page=3; param.size=10; $ ...

  9. 点击TButton后的执行OnClick和OnMouseDown两个事件的过程(其实是通过WM_COMMAND执行程序员的代码)

    问题的来源:在李维的<深入浅出VCL>一书中提到了点击TButton会触发WM_COMMAND消息,正是它真正执行了程序员的代码.也许是我比较笨,没有理解他说的含义.但是后来经过追踪代码和 ...

  10. 详解Dialog(二)——有关列表的构建

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 前言:这段时间真是忙啊忙啊忙,元旦三天假加了两天班,已经连续六周只放一天了,天天加班到十点多,真是有一口血吐在屏幕上的感觉了,博 ...