前言:本文基于上一篇文章中的源代码进行改写,地址: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,开启服务器成功