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