什么是模块?

模块分为原生模块(node.jsAPI提供的原生模块,在启动时已经被加载)和
文件模块(动态加载模块,主要由原生模块module来实现和完成。通过调

用node.js的require方法来实现加载)。
//调用原生API的方法

var httpModule =require('http');//加载http模块

httpModule是require原生http模块返回的对象。类似java中类的对象。
//调用文件模块的方法

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

也可为

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

可以看出,文件模块是需要指定路径的。
返回对象test可以调用文件的那些属性和方法呢?
node.js中明确指出,只有exports和module.exports对象暴露给该外部的

属性个方法,可以使用require对象进行调用。

exports和module.exports是什么?可参考一下连接http://cnodejs.org/topic/5231a630101e574521e45ef8

例如如下模块

/**
*
*exports test code
*
*/
exports.name="danhuang";//exports暴露name属性
exports.happy=function(){console.log("mm")};//exports暴露happy方

function love(){console.log("520");}

以上代码,只可通过require的对象调用name属性和happy方法。
可以通过打印对象,查看它所拥有的属性和方法
console.log(test);

二、nodejs实现web解析DNS

1.需要用到那些模块

以下为源代码

getDNS.js

//首先require加载需要的nodejs原生模块
var http=require("http"),//服务器创建
dns=require("dns"),//DNS查询
fs=require("fs"),//文件操作
url=require("url"),//url处理
querystring =require("querystring");字符串处理 //创建服务器
http.createServer(function(req,res){
//添加http响应的头信息
res.writeHead(200,{'Content-Type':'text/html'});
//获取当前index.html的路径
var readPath=_dirname+'/'+url.parse('index.html').pathname;
//获取index.html的文件数据
var indexPage=fs.readFileSyns(readPath);
//执行http响应返回到客户端
res.end(indexPage);
}).listen(3000,"127.0.0.1");

index.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>DNS查询</title>
</head>
<body>
<h1 style="text-aglin:center">DNS查询工具</h1>
<div style="text-aglin:center">
<form action="/parse" method="post">
查询DNS:<input type="text" name="search_dns"/>
<input type="submit" value="查询" />
</form>
</div>
</body>
</html>

运行getDNS.js文件

在cmd中输入,如果getDNS文件的存放路径不再默认位置,需要先打开存放位置 cd C:nodejs/test/(假设我的文件存放目录为C盘的nodejs文件夹下的test文件夹内)

node getDNS.js

  然后打开浏览器输入node.js的监听端口,即getDNS.就是文件中指定的端口:http://127.0.0.1:3000 ,服务器会返回页面到客户端

注意:上面的代码是无法使用form表单提交的,需要将getDNS.js中的代码进行修改

修改后如下:

//首先require加载需要的nodejs原生模块
var http=require('http'),//服务器创建
dns=require('dns'),//DNS查询
fs=require('fs'),//文件操作
url=require('url'),//url处理
querystring =require("querystring");//字符串处理 //创建服务器
http.createServer(function(req,res){
//获取当前请求资源的路径
var pathname=url.parse(req.url).pathname;
//设置返回客户端的数据格式
req.setEncoding("utf8");
//添加http响应的头信息
res.writeHead(200,{'Content-Type':'text/html'});
//处理不同的请求资源,分发处理
router(res,req,pathname);
}).listen(8888,"127.0.0.1");
// console.log("server run at http://127.0.0.1:8888/");
function router (res,req,pathname) {
switch(pathname){//根据pathname不同,执行不同的处理逻辑
case "/parse":
parseDns(res,req)//执行域名解析
break;
default:
goIndex(res,req)//显示html页面
}
} function goIndex (res,req) {
//获取文件路径
var readPath =__dirname + '/' +url.parse('index.html').pathname;
//读取html文件信息
var indexPage =fs.readFileSync(readPath);
//通过res响应html数据到客户端
res.end(indexPage);
}
function parseDns (res,req) {
var postData="";
//读取客户端传递的数据,并将数据添加到pastData中
req.addListener("data",function(postDataChunk){
postData += postDataChunk;
});
//http响应html页面信息,数据接收完成,end函数触发
req.addListener("end",function(){
//getDNS异步域名解析,执行完成活回调执行function(domain,addresses){},domain是传递的域名参数,addresses是ip地址列表
var retData = 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=UTF-8'></head><div style='text-aglin:center'>Domain:<span style='color:red'>"+domain+"</span>IP:<span style='color:red'>"+addresses.join(',')+"</span></div></html>");
});
return;
});
}
function getDns (postData,callback) {
//获取postdata数据中键值为search_dns的值
var domain=querystring.parse(postData).search_dns;
//异步解析域名
dns.resolve(domain,function(err,addresses){
if(!addresses){
addresses=['域名不存在']
}
callback(domain,addresses);
});
}

以上就是通过nodejs实现一个DNS域名解析的网站。一个真正意义上的网站算是搭建完成了!!

纯手打,好累.....

nodejs概论(实操篇)的更多相关文章

  1. HDFS集群PB级数据迁移方案-DistCp生产环境实操篇

    HDFS集群PB级数据迁移方案-DistCp生产环境实操篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 用了接近2个星期的时间,终于把公司的需要的大数据组建部署完毕了,当然,在部 ...

  2. ESP8266 NodeMCU小白手把手入门(实操篇)以土壤湿度和DHT传感器为例讲解读取传感器的值

    物联网使得现实世界中的实体和数字世界比以往任何时候都更紧密地联系在一起.NodeMCU作为其中的一个重要设备,作用之一就是与传感器相连以实现万物互联通讯.这篇关于NodeMCU的实操篇以土壤湿度传感器 ...

  3. Linux实操篇

    一:用户管理.群组管理 增: 1.指定群组添加账户: groupadd test 创建test用户组useradd -g test(用户组) xiaoming(用户名)       ---- 创建us ...

  4. Linux实操篇 vi和vim编辑器

    vi和vim的基本介绍 所有的Linux系统都会内建vi文本编辑器. vim具有程序编辑的能力,可以看做是vi的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计.代码补完.编译及错误跳转等 ...

  5. python 学习分享-购物车实操篇

    程序要求如下: '''购物车程序: 启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就 ...

  6. 使用Jenkins与Docker持续集成与发布NetCore项目(实操篇)

    使用Jenkins与Docker持续集成与发布NetCore项目(教程一) 原文地址:https://www.cnblogs.com/Jackyye/p/12588182.html 基本环境 该教程的 ...

  7. 02_Linux实操篇

    第五章 VI和VIM编辑器 5.1. VI和VIM基本介绍 Vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器.由于对Unix及Linux系统的任何版本,Vi ...

  8. redis实操-sentinel

    本文主要记录一些操作步骤,作为自己学习的一个记录,也供虚拟机上学习redis的人参考. 实操篇,可以参考 http://redis.cn/ 主从复制实操 在test目录下新建配置进行练习 1.mkdi ...

  9. Kafka集群优化篇-调整broker的堆内存(heap)案例实操

    Kafka集群优化篇-调整broker的堆内存(heap)案例实操 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看kafka集群的broker的堆内存使用情况 1>. ...

随机推荐

  1. curl post传递json数据

    有时想在命令行使用post http提交一个表单,比较常用的是POST模式和GET模式 GET模式什么option都不用,只需要把变量写在url里面就可以了 比如:curl http://www.wa ...

  2. 【转】NDK编译可执行文件在Android L中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。

    原文网址:http://blog.csdn.net/hxdanya/article/details/39371759 由于使用了NDK编译的可执行文件在应用中调用,在4.4及之前的版本上一直没出问题. ...

  3. (转载)MySQL 统计数据行数 Select Count

    (转载)http://www.5idev.com/p-php_mysql_select_count.shtml 统计数据行数 SELECT COUNT() FROM 语法用于从数据表中统计数据行数. ...

  4. 图论(生成树):HDU 5631Rikka with Graph

    Rikka with Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  5. 微信支付【get_brand_wcpay_request:fail_invalid appid】

    微信支付授权目录一定要注意大小写 艹 如下的WXPay2 千万不要写成WxPay2了 参考地址:http://q.cnblogs.com/q/70405/ 微信支付代码下载:http://files. ...

  6. [Locked] Paint House I & II

    Paint House There are a row of n houses, each house can be painted with one of the three colors: red ...

  7. 图解向hadoop分布式文件系统写文件的工作流程

    网上看到一张关于hadoop分布式文件系统(hdfs)的工作原理的图片,其实主要是介绍了向hdfs写一个文件的流程.图中的流程已经非常清晰,直接上图 好吧,博客园告诉我少于200字的文章不允许发布到网 ...

  8. JavaScript中的[]和{}

    最早开始对js中括号的使用有疑问是在交互2值的时候: a = [b,b=a][0]; 详见JavaScript交换两个变量值的七种解决方案 因为 [[]][0] 的意思是:获取 [[]] 的第一个元素 ...

  9. git上解决代码冲突

    1.切换到master: git co master 2.拉最新代码:git pull origin master 3.删掉多余符号 4.切换到提交的分支:git br Txxxx 5.合并:git  ...

  10. java 吞吐量

    jvm中 ,执行用户的代码占 的时间/总时间 ,假如前者是99 分钟,后者一分钟,则吞吐量为99% ,吞吐量越大.系统越好,如何设计系统,导致系统吞吐量高,因为我们知道,垃圾回收,7种垃圾收集器,也不 ...