【NodeJS学习小案例】DNS域名解析 <三>

645 查看

上一节我们已经完成了静态页面 index.html 的布局,这节我们开始服务器的编写。

如同 php 那样脚本文件以 .php 为文件扩展名,NodeJS的脚本文件扩展名为 .js

在这个例子中我们需要以下原生模块:

http 模块负责 HTTP 服务器的创建
dns 模块主要负责解析当前 DNS 域名,返回 DNS 服务器 IP 地址
fs 模块负责对文件的操作
url 模块处理 url
querystring 模块处理当前前端传来的字符串并解析

进入我们的项目所在目录 E:\node_workspace\code ,新建 index.js 文件,在这个入口问价中我们需要创建服务器并设置路由,添加如下内容:

/* 首先require 加载两个模块 */
var http = require('http'), 
    url  = require('url') ;
/* 查看官网API我们可以看到http模块提供创建http的方法,dns提供解析dns的方法 */
/* 加载文件模块 */
var Router   = require('./router.js');

/* 创建http服务器 */
http.createServer(function(req, res) {
    /* 写http head 返回html,因此Content-Type为html*/
    var pathname = url.parse(req.url).pathname;
    req.setEncoding("utf8");
    res.writeHead(200);
    Router.router(res, req, pathname);
}).listen(3000, "127.0.0.1");
/* 打印运行log */
console.log('Server running at http://127.0.0.1:3000/');

在第一节我们就说了NodeJS 的模块,其中除了原生模块之外还有文件模块,关于模块中的 exportsmodule.exports 请移步(参考)。

这里使用了 router.js 文件,这个文件是对网站前端发来的各个路由的处理,添加如下内容:

/* 路由模块处理 */
var ParseDns = require('./parse_dns.js'),
    MainIndex = require('./main_index.js');
exports.router = function(res, req, pathname){
    switch (pathname){
        case "/parse": 
            ParseDns.parseDns(res, req)
        break;
        default: 
            MainIndex.goIndex(res, req)
    }
}

在这个文件中我们主要有两个路由:'/''/parse' ,对应着不同的处理方式,所以这里对这两个路由又引入了另外两个文件模块来处理:parse_dns.jsmain_index.js

新建 parse_dns.js ,添加如下内容:

/* dns解析模块 */
var querystring = require("querystring"),
    url = require("url"),
    dns = require('dns');
exports.parseDns = function(res, req){
    var postData = "";
    postData = querystring.parse(url.parse(req.url).query);
    getDns(postData,function(domain,addresses){
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end(JSON.stringify({  
            domain: domain,
            addresses: addresses.join(',')
        }));
    });
}

function getDns(postData,callback){
    var domain = postData.search_dns;
    dns.resolve(domain, function(err, addresses){
        if(!addresses){
            addresses=['Not Exist !']
        }
        callback(domain, addresses);
    });
}

这里引入了 querystringurldns 三个原生模块,

url.parse(req.url).query 获取到请求的路由中的 query 值,由 ‘=’ 连接的字符串
querystring.parse()query 值转换为对象
JSON.stringify({domain:domain,addresses: addresses.join(',')}) 从一个对象解析出字符串

新建 main_index.js ,添加如下内容:

/* 处理首页逻辑信息 */
var fs = require('fs'),
    url = require('url');
exports.goIndex = function(res, req){
    var readPath = __dirname + '/' +url.parse('index.html').pathname;
    var indexPage = fs.readFileSync(readPath);
    /* 返回 */
    res.end(indexPage);
}

__dirname + '/' +url.parse('index.html').pathname 获取 index.html 文件
fs.readFileSync(readPath) 读取文件内容
res.end(indexPage) 通过 response.end() 输出内容

到这里我们的项目就差不多完成了。

打开 cmd ,切换到 E:\node_workspace\code 项目目录,执行以下命令:

node index.js

我们会看到在下面会输出日志:

Server running at http://127.0.0.1:3000/

打开浏览器,在地址栏输入 http://127.0.0.1:3000 即可看到如下界面:

输入一个网址,点击查询即可在下面看到对应的 IP 地址。

下一节我们就一些体验进行改善。