• 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,开启服务器成功




  • 相关阅读:
    EntityFramework查询联合查询(Join,GroupJoin)
    浏览器向服务器请求页面的原理
    如何获取浏览器类型和版本
    64位Win7下32位IE无法启动问题
    jQuery 收藏
    JavaScript五种继承方式[转]
    针对模板页面的数据爬虫实现方法探讨
    ArcGISFlexSDK中关于切换地图问题(不同范围)
    NodeJS缓存文件夹遍历
    高通配置uart
  • 原文地址:https://www.cnblogs.com/eguid/p/6821597.html
Copyright © 2020-2023  润新知