nodejs 3 模块

来源:互联网 发布:java syslog4j 编辑:程序博客网 时间:2024/05/21 02:19

模块分为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.jsexports.name = "zula"; //exports nameexports.happy = function() {console.log("zula is xiaoxiannv")}; //exports happy functionvar yourName = "reader";function love() {    console.log(yourName + "love zula" );}//app.jsvar 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.jsvar 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

image

【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】 运行结果

image]


重构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);}
原创粉丝点击