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

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




原文地址:https://www.cnblogs.com/eguid/p/6821597.html