前言:本文基于上一篇文章中的源代码进行改写,地址:http://blog.csdn.net/eguid_1/article/details/52182386

注意:为什么不用module.exports,而使用exports?

module.exports的优先级比exports要高,为了防止自定义的模块与nodeJS原生模块冲突,所以这里采用exports定义模块名

文件名:root.js(node入口),parseRequest.js(自定义模块)

一、自定义nodejs模块

parseRequest.js文件代码
//文件名:parseRequest.js
//将自定义parseRequest模块映射到parseReq入口,调用时直接调parseRequest(s1, s2),而不是parseReq(s1,s2)
exports.parseRequest = parseReq;
//用于处理所有请求
function parseReq(s1, s2) {
var fs = s1;
var queryString = s2;
//解析REST请求
var restParse = function(response, pathName, queryStr) {
//解析请求参数
var reqStr = queryString.parse(queryStr);
switch (pathName) {
//简单实例,解析请求参数获取用户名并通过json数据返回
case "/dojoTest/getUser":
response.writeHead(200, { 'Content-Type': 'application/json;charset=utf-8' });
var str = "{'errNum': 200,'retMsg': '请求成功','data':' 用户名是:" + reqStr.user + "'}";
response.write(str);
break;
//简单实例:通过REST请求方式获取当前时间
case "/dojoTest/getTime":
response.writeHead(200, { 'Content-Type': 'application/json;charset=utf-8' });
response.write("{'errNum': 200,'retMsg': '请求成功','data':' 当前时间:" + new Date().toLocaleString() + "'}");
break;
//如果没有对应的REST请求,报个501错误给浏览器
default:
response.writeHead(501, { 'Content-Type': 'application/json;charset=utf-8' });
response.write('{"errNum": 501,"retMsg":"请求失败:该请求不存在","data":"null"}'); }
response.end();
};
//解析静态请求
var fileParse = function(response, pathName, suffixStr) {
//读取静态文件并生成流
fs.readFile(pathName.substr(1), function(err, data) {
if (err) {
console.log(err);
//HTTP 404 :页面不存在
//没找到对应的静态文件怎么办,给个404错误
response.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });
//响应文件流
response.write("页面不存在!404");
response.end();
} else {
//HTTP 200 : 成功
if (suffixStr === ".css") {
//设置charset=utf-8防止乱码
response.writeHead(200, { 'Content-Type': 'text/css;charset=utf-8' });
} else {
response.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
}
//响应文件流
response.write(data.toString());
response.end();
}
});
}
return {
parseRest: restParse,
parseFile: fileParse
}
};

二、引入nodejs模块

1、在nodejs启动文件中这样引入:



var rRequest = require('./parseRequest');

注意:./表示与本文件在同一级目录下,也可以写成./parseRequest.js,默认不需要写后缀

2、调用引入的模块

var allReqParse = new rRequest.parseRequest(fs, queryString);

通过这个对象就可以调用里面定义好的public方法了:

 rRequest.parseFile(response, pathname, suffix);

allReqParse.parseRest(response, pathname, query);


3、root.js文件代码
//加载自定义模块(./表示与本文件在同一级目录下,也可以写成./parseRequest.js,默认不需要写后缀)
var rRequest = require('./parseRequest');
//加载node模块
var http = require('http');
var fs = require('fs');
var url = require('url');
var path = require('path');
var queryString = require('querystring');
//创建请求处理对象,用于处理静态文件及动态请求响应
var allReqParse = new rRequest.parseRequest(fs, queryString);
//创建服务器
http.createServer(function(request, response) {
//获取请求地址
var requrl = request.url;
var urlparse = url.parse(requrl);
//请求路径
var pathname = urlparse.pathname;
//pathname+参数
// var urlpath = urlparse.path;
//参数
var query = urlparse.query;
//同上,但参数前多个?
// var search = urlparse.search;
//后缀
var suffix = path.extname(pathname);
//控制台显示信息
// console.log("Request for " + pathname + " received,path is " + urlpath + ",query is" + query + ",search is" + search);
console.log("Request for " + pathname + "received,后缀是: " + suffix + ",参数: " + query);
if (suffix != null && suffix.trim() != "") {
rRequest.parseFile(response, pathname, suffix);
} else {
allReqParse.parseRest(response, pathname, query);
}
//响应结束
}).listen(8081);
//开启后在控制台显示该服务正在运行
console.log('Server running at http://127.0.0.1:8081/');

三、进一步深入模块化

看到上面的node入口是不是感觉代码太冗杂,那么现在我们实现创建server的模块化,让node入口彻底清爽

分三个文件:root.js,createServer.js(新创建,用于封装root.js中的服务器创建代码),parseRequest

三个文件的调用关系是root.js<----createServer.js<----parseRequest.js

注意:parseRequest.js中的代码保持不变

1、改写后的root.js

var server = require("./createServer");
//创建服务器
server.createServer(8081);

2、新建的createServer.js文件(直接复制了原有root.js代码,增加了一个端口变量)

//加载自定义模块(./表示与本文件在同一级目录下,也可以写成./parseRequest.js,默认不需要写后缀)
var rRequest = require('./parseRequest');
//加载node模块
var http = require('http');
var fs = require('fs');
var url = require('url');
var path = require('path');
var queryString = require('querystring');
//创建请求处理对象,用于处理静态文件及动态请求响应
var allReqParse = new rRequest.parseRequest(fs, queryString); function start(port) {
var startServer = function(request, response) {
//获取请求地址
var requrl = request.url;
var urlparse = url.parse(requrl);
//请求路径
var pathname = urlparse.pathname;
//pathname+参数
// var urlpath = urlparse.path;
//参数
var query = urlparse.query;
//同上,但参数前多个?
// var search = urlparse.search;
//后缀
var suffix = path.extname(pathname);
//控制台显示信息
// console.log("Request for " + pathname + " received,path is " + urlpath + ",query is" + query + ",search is" + search);
console.log("Request for " + pathname + "received,后缀是: " + suffix + ",参数: " + query);
if (suffix != null && suffix.trim() != "") {
allReqParse.parseFile(response, pathname, suffix);
} else {
allReqParse.parseRest(response, pathname, query);
}
//响应结束
}
//创建服务器
http.createServer(startServer).listen(port); //注意这里的端口改成了变量
//开启后在控制台显示该服务正在运行
console.log('Server running at http://127.0.0.1:' + port + '/');
};
exports.createServer = start;

3、运行node,开启服务器成功

nodeJS实战:自定义模块与引入,不同模块的函数传递及回调处理,exports与module.exports(基于nodejs6.2.0)的更多相关文章

  1. nodejs模块中exports和module.exports的区别

    通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require('模块名')去获取:核心 ...

  2. nodeJS学习(9)--- nodeJS模块:exports vs module.exports

    模块简介: 通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ 这些核心模块被编译成二进制文件,可以 require('模块名') ...

  3. 理解node模块的exports和module.exports

    exports是module.exports的引用,即var exports = module.exports.在一个模块的开头,这两个值都指向同一个空对象:exports = module.expo ...

  4. node.js模块中exports和module.exports的区别

    Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定 ...

  5. (译)Node.js的模块-exports和module.exports

    原文标题:Node.js Module – exports vs module.exports 原文链接:http://www.hacksparrow.com/node-js-exports-vs-m ...

  6. NodeJS的exports、module.exports与ES6的export、export default深入详解

    前言 决定开始重新规范的学习一下node编程.但是引入模块我看到用 require的方式,再联想到咱们的ES6各种export .export default. 阿西吧,头都大了.... 头大完了,那 ...

  7. nodejs中exports与module.exports的区别详细介绍

    如果模块是一个特定的类型就用Module.exports.如果模块是一个典型的"实例化对象"就用exports. exports.name = function() { conso ...

  8. 【nodejs】exports 和 module.exports 的区别

    require 用来加载代码,而 exports 和 module.exports 则用来导出代码.但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 e ...

  9. nodejs中exports与module.exports的区别

    转自--http://www.cnblogs.com/pigtail/archive/2013/01/14/2859555.html 你肯定非常熟悉nodejs模块中的exports对象,你可以用它创 ...

随机推荐

  1. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化

    本文提要 最近写的几篇文章都是关于数据层优化方面的,这几天也在想还有哪些地方可以优化改进,结合日志和项目代码发现,关于数据层的优化,还是有几个方面可以继续修改的,代码方面,整合了druid数据源也开启 ...

  2. ZJOI2017 Round#2 滚粗记

    在杭州的火车站的KFC餐厅里,独自一人,闲来无事,便写写这篇博客.刚刚的一个礼拜,经历了余姚的省选和杭州的数学集训,感觉有些浪,学校里现在还在上新课,我已经落下一个礼拜的文化课了,回去估计补死:最重要 ...

  3. eclipse--java工程转web工程 以及 java或java web工程转maven工程

    1.  打开工程文件夹,编辑工程的.project文件. 在<natures></natures>中加入 <nature>org.eclipse.wst.commo ...

  4. css浮动布局,浮动原理,清除(闭合)浮动方法

    css浮动 1.什么是浮动:在我们布局的时用到的一种技术,能够方便我们进行布局,通过让元素浮动,我们可以使元素在水平上左右移动,再通过margin属性调整位置 2.浮动的原理:使当前元素脱离普通流,相 ...

  5. python3 time模块与datetime模块

    time模块 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主要调用C库,所以各个平 ...

  6. elasticsearch系列(二) esrally压测

    环境准备 linux centOS(工作环境) python3.4及以上 pip3 JDK8 git1.9及以上 gradle2.13级以上 准备过程中的坑 这些环境准备没什么太大问题,都是wget下 ...

  7. Python基本语法--语句

    # -*- coding: utf-8 -*- #条件语句 ''' if 判断条件: 执行语句…… else: 执行语句…… ''' flag = False name = 'python' if n ...

  8. Windows 随手笔记

    1.常见快捷方式 远程桌面 mstsc 注册表 regedit 组策略 gpedit.msc 2.Windows命令手册 ping命令 ping [-t] [-a] [-n count] [-l le ...

  9. 谈谈RDD、DataFrame、Dataset的区别和各自的优势

    在spark中,RDD.DataFrame.Dataset是最常用的数据类型,本博文给出笔者在使用的过程中体会到的区别和各自的优势 共性: 1.RDD.DataFrame.Dataset全都是spar ...

  10. javaweb之监听器详解

    在servlet中定义了多种类型的监听器,他们用于监听事件源分别是servletContext,httpsession,servletrequest 这三个域对象. servlet中监听器主要有三类: ...