欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nodejs 3 模块

程序员文章站 2022-06-29 17:42:44
...

模块分为2大类: 原生模块和文件模块

  • 原生模块: node.js api提供的原生模块,在启动时就已经被加载。
  • 文件模块: 动态加载模块,加载文件模块时需要通过原生模块module来实现和完成。

原生模块调用

应用node.js提供的api require来加载相应的node.js模块,require加载成功后会返回一个node.js模块的对象,该对象拥有该模块的所有属性和方法。

var httpModule = require("http");
  • http: node.js提供的原生模块
  • httpModule: require后返回的对象,通过该对象可调用http模块的所有属性和方法。
 httpModule.createServer(function(req, res) {
     //some code
 }).listen(port);

文件模块调用

var test = require('/path/../test.js')
//var test = require('/path/../test')

注意:

  • require的路径为绝对路径或相对路径
  • 返回值为require的文件抛出的对象
  • 只有exports和module.exports对象暴露给外部的属性和方法,才能通过返回的require对象进行调用。
//test.js

exports.name = "zula"; //exports name
exports.happy = function() {console.log("zula is xiaoxiannv")}; //exports happy function
var yourName = "reader";
function love() {
    console.log(yourName + "love zula" );
}

//app.js
var test = require("./test.js");
console.log(test);

//终端输出
{ name: 'zula', happy: [Function] }

实现web解析DNS

【1】 创建parse_dns_ex.js,加载需要的node.js原生模块

  • web的http服务器:http模块
  • dns解析: dns模块
  • 读取html页面:fileSystem模块
  • 处理请求参数:querystring模块
//parse_dns_ex.js

var http        = require("http"); //服务器创建
    dns         = require("dns"); //dns查询
    fs          = require("fs"); //文件操作
    url         = require("url"); //url处理
    querystring = require("querystring"); //字符串处理

【2】 parse_dns_ex.js添加http服务器代码,返回显示index.html

http.createServer(function(req, res) {
    //添加http请求头信息, 返回html, Content-Type = html
    res.writeHead(200, { "Content-Type": "text/html" });
    //获取html文件的路径
    var readPath = __dirname + "/" + url.parse("index.html").pathname;
    //同步读取index.html内容
    var indexPage  = fs.readFileSync(readPath);
    //返回
    res.end(indexPage);
}).listen(3000, "127.0.0.1");

<!--index.html-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>dns查询</title>
    <meta http-equiv="content-type" content="text/html; charset=urf-8">
</head>
<body>
    <h1 style="text-align: center;">dns查询工具</h1>
    <div style="text-align: center;">
        <!-- 提交到http://127.0.0.1:3000/parse -->
        <form action="/parse" method="post">
            查询dns: <input type="text" name="search_dns">
            <input type="submit" value="查询">
        </form>
    </div>
</body>
</html>

【3】 运行parse_dns_ex.js parse_dns_ex.js

打开浏览器输入http://127.0.0.1:3000

nodejs 3 模块

【4】 新增处理/parse请求路由

添加对http://127.0.0.1:3000/parse的请求处理


http.createServer(function(req, res) {
    var pathname = url.parse(req.url).pathname; //获取当前请求资源的url路径, 例如"/parse"
    req.setEncoding("utf8"); //设置返回客户端页面的数据格式
    router(req, res, pathname); //调用router方法处理url路由
}).listen(3000, "127.0.0.1");

//router(req, res, pathname);
function router(req, res, pathname) {
    switch (pathname) { //根据pathname不同,执行不同的处理逻辑
        case "/parse" :
            parseDns(req, res);
        break;
        default:
            goIndex(req, res);
    }
}


/**
 * [goIndex 定义响应html页面的函数]
 * @Author zhulu
 * @Date   2017-09-13
 * @param  {[object]}   req [http请求对象]
 * @param  {[object]}   res [http响应对象]
 */
function goIndex(req, res) {
    //添加http请求头信息, 返回html, Content-Type = html
    res.writeHead(200, { "Content-Type": "text/html" });
    //获取html文件的路径
    var readPath = __dirname + "/" + url.parse("index.html").pathname;
    //同步读取index.html内容
    var indexPage  = fs.readFileSync(readPath);
    //返回
    res.end(indexPage);
}

/**
 * [parseDns 解析客户端传递来的域名,并返回显示该域名相应的ip]
 * @Author zhulu
 * @Date   2017-09-13
 * @param  {[object]}   res [http请求对象]
 * @param  {[object]}   req [http响应对象]
 */
function parseDns(req, res){
    var postData = "";

    //数据传递到服务器时触发的事件函数,读取客户端传递来的数据,添加到postData里。
    req.addListener("data", function(postDataChunk) {
        postData += postDataChunk;
    });
    //数据接收完成,end事件触发后执行dns域名解析
    //getDns异步解析域名,执行完成后回调function(domain, addresses){}
    req.addListener("end", function(postDataChunk) {
        //http 相应html页面信息
        var resData = getDns(postData, function(domain, addresses) {
            res.writeHead(200, { "Content-Type": "text/html" });
            res.end('\
                <html>\
                    <head>\
                        <meta http-equiv="content-type" content="text/html; charset=urf-8">\
                    </head>\
                    <div style="text-align: center;">\
                        Domain: <span style="text-align: center;">'+ domain +'</span>\
                        IP: <span style="text-align: center;">'+ addresses.join(",") +'</span>\
                    </div>\
                </html>');
        });
        return;
    });
}

function getDns(postData, callback) {
    var domain = querystring.parse(postData).search_dns;
    dns.resolve(domain, function(err, addresses) {
        if (!addresses) {
            addresses = [ "不存在域名" ];
        }
        callback(domain, addresses);
    })
}

【5】 运行结果

nodejs 3 模块]


重构dns解析网站

将业务处理分离,每个模块处理相应职责,避免业务混乱。利用文件模块,将系统分为不同的功能模块去实现和完成。

将系统分为: 服务器创建模块、路由处理模块、逻辑控制模块、数据处理模块、错误处理模块等。

dns解析系统分为: 仓库(喜欢请star(๑•ᴗ•๑))

  1. 入口模块index.js

    创建http服务,加载router文件模块,分发请求资源

    var http  = require("http"); //服务器创建
        url   = require("url"); //url处理
    var router = require("./router.js");
    
    http.createServer(function(req, res) {
        var pathname = url.parse(req.url).pathname; //获取当前请求资源的url路径, 例如"/parse"
        req.setEncoding("utf8"); //设置返回客户端页面的数据格式
        router.router(req, res, pathname); //调用router方法处理url路由
    }).listen(3000, "127.0.0.1");
    
  2. 路由处理模块router.js

    处理所有请求资源,分发到相应处理器。

    var ParseDns = require("./parse_dns.js");
    var MainIndex = require("./main_index.js");
    
    exports.router = function (req, res, pathname) {
        switch (pathname) { //根据pathname不同,执行不同的处理逻辑
            case "/parse" :
                ParseDns.parseDns(req, res);
            break;
            default:
                MainIndex.goIndex(req, res);
        }
    }
  3. DNS解析模块parse_dns.js

    dns逻辑处理

    var  dns    = require("dns"), //dns查询
    querystring = require("querystring"); //字符串处理
    
    
    /**
     * [parseDns 解析客户端传递来的域名,并返回显示该域名相应的ip]
     * @Author zhulu
     * @Date   2017-09-13
     * @param  {[object]}   res [http请求对象]
     * @param  {[object]}   req [http响应对象]
     */
    exports.parseDns = function(req, res){
        var postData = "";
    
        //数据传递到服务器时触发的事件函数,读取客户端传递来的数据,添加到postData里。
        req.addListener("data", function(postDataChunk) {
            postData += postDataChunk;
        });
        //数据接收完成,end事件触发后执行dns域名解析
        //getDns异步解析域名,执行完成后回调function(domain, addresses){}
        req.addListener("end", function(postDataChunk) {
            //http 相应html页面信息
            var resData = getDns(postData, function(domain, addresses) {
                res.writeHead(200, { "Content-Type": "text/html" });
                res.end('\
                    <html>\
                        <head>\
                            <meta http-equiv="content-type" content="text/html; charset=urf-8">\
                        </head>\
                        <div style="text-align: center;">\
                            Domain: <span style="text-align: center;">'+ domain +'</span>\
                            IP: <span style="text-align: center;">'+ addresses.join(",") +'</span>\
                        </div>\
                    </html>');
            });
            return;
        });
    }
    
    //私有方法
    function getDns(postData, callback) {
        var domain = querystring.parse(postData).search_dns;
        dns.resolve(domain, function(err, addresses) {
            if (!addresses) {
                addresses = [ "不存在域名" ];
            }
            callback(domain, addresses);
        })
    }
  4. 首页展示模块main_index.js

    处理主页index.html页面展示

    var fs = require("fs"), //文件操作
       url = require("url"); //url处理
    /**
     * [goIndex 定义响应html页面的函数]
     * @Author zhulu
     * @Date   2017-09-13
     * @param  {[object]}   req [http请求对象]
     * @param  {[object]}   res [http响应对象]
     */
    exports.goIndex = function(req, res) {
        //添加http请求头信息, 返回html, Content-Type = html
        res.writeHead(200, { "Content-Type": "text/html" });
        //获取html文件的路径
        var readPath = __dirname + "/" + url.parse("index.html").pathname;
        //同步读取index.html内容
        var indexPage  = fs.readFileSync(readPath);
        //返回
        res.end(indexPage);
    }