NodeJS之域名解析器实现

之前草草的了解了下Nodejs, 只是大体知道Nodejs类似于一个JavaScript解析器,可以跑JS代码,但是并没有真正去使用Nodejs,且对其理解并不深,所以打算整体学一学Nodejs。

整个学习过程是沿着“Nodejs开发实战详解–黄丹华”这本书来看的,目前学习了Nodejs的模块,分为内建模块和文件模块。并且书中有一个DNS域名解析器的实现,自己动手也做了做,这里想做下整理和总结。

Nodejs内建模块

首先,我们来认识下Nodejs的内建模块。模块是什么呢?通俗些讲,一个能完成某个特定功能的单独出来的js文件,可以称之为一个模块。而Node的内建模块,是Node环境安装之后就已经加载了的,要使用时,通过require将该模块导入,就可以使用其模块对应的接口了。

这部分的学习,可以参考Nodejs中文网的api部分,上面有很多内建模块,比如http, dns, fs, url, 等等。
我们在使用这些模块时,首先需要require导入这些模块。举下面一个简单例子:

//这里使用了Nodejs的Http模块,并调用其API启了一个服务器,监听1880端口
var http = require('http');
http.createServer(function( req, res){
    res.end('hello world');
}).listen(1880, '127.0.0.1');

DNS解析器

关于DNS解析器,我们设想这样一种情景,有一个网页,输入某个域名,点击之后会将输入的域名发送给服务器,服务器这时会进行域名解析,并将解析的结果发回给客户端,显示在网页上。

这里我们先把这样的一个网页实现出来,不考虑与服务器的交互。首先想到的就是用Form标签来实现。在这次使用时,我觉得Form真的是一个挺厉害的HTML标签,以前没有体会到。为什么会这么说呢,因为Form是可以规定以哪种方式向服务器发起请求,并且可以规定请求之后的网页跳转地址跳到哪个Hash值。举个很简单的例子:

//我们有一个HTML文件,有一个提交按钮
//action其实就是跳转的地址,method其实就是请求的方法
"test.php" method="get"> type="submit" value="提交" />

同目录下,有一个test.php文件


   echo "Hello Ajax!";
?>

启动服务器后,访问上面的html文件,得到下面的结果
NodeJS之域名解析器实现_第1张图片
点击按钮之后,得到的结果如下
NodeJS之域名解析器实现_第2张图片

注意红色画出来的部分,导致Hash值变了,也就是路由变了,这个后面会有用到。

因此整体HTML文件结构已经出来了,这里我截个图放上来
NodeJS之域名解析器实现_第3张图片

下来要做的就是启一个服务器,如何将那个HTML页面呈现出来。这里就要用到NodeJS的HTTP模块,首先将该模块导入,如上面例子一样再调API就可以启服务器了,至于输出为HTML页面,一方面要设Content-Type,另一方面,把上述例子输出的hello world 改成HTML文件的内容就可以了。那么如何读到HTML文件的内容,这里就需要再引入fs模块,读文件。

var http = require('http');
var fs = require('fs');
http.createServer(function(req, res){
    res.writeHead(200, {'Content-Type': 'text/html'});
    var content = fs.readFileSync('./index.html');
    res.end(content);
})

接下来,我们要考虑的就是动态的行为,如何将表单里面输入的东西传输到服务器端,我们考虑用POST方法,数据可以通过FORM来获取到。因为我们采用的是Form表单提交的方式,所以什么时候才知道点击了按钮吗?即只有当页面跳转到action所指的Hash路由时,才知道提交了数据,这时我们采用的是判断路由的方式来分情况处理。具体点,就是,如果路由Hash是parse,那么去执行DNS解析;否则直接显示index.html页面,当然,相应的Form表单里的action就要声明是’/parse’。这里需要说明的是,读取路由的API就要引入url模块了。

具体的DNS解析的话,首先要引入dns模块。另外, 如何获取到表单提交的数据,这里需要监听两个事件,一个是’data’, 另一个是’end’。Nodejs中监听事件API可以用on,也可以用addListener。拿到数据之后,调用DNS解析接口,将解析结果返回给回调函数,回调函数将结果展示到页面上,就完成了此次我们的解析器。

你可能感兴趣的:(JavaScript)