什么是模块?

模块分为原生模块(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. Tautology

    WFF 'N PROOF is a logic game played with dice. Each die has six faces representing some subset of th ...

  2. Delphi XE6 for Android 让手机震动(调用Java的函数)

    震动,是调用了 安卓api  JNI 里面的 函数  ,这些都是 调用java的 ,如下面的引用, uses  FMX.Helpers.Android,  Androidapi.JNI.App,  A ...

  3. 【POJ】3283 Card Hands

    字典树. #include <iostream> #include <cstdio> #include <cstring> #include <string& ...

  4. 【HDOJ】2451 Simple Addition Expression

    递推,但是要注意细节.题目的意思,就是求s(x) = i+(i+1)+(i+2),i<n.该表达中计算过程中CA恒为0(包括中间值)的情况.根据所求可推得.1-10: 31-100: 3*41- ...

  5. POJ 3694 Network(无向图求桥+重边处理+LCA)

    题目大意: 给你一个无向图,然后再给你一个Q代表有Q次询问,每一次加一条边之后还有几座桥.在这里要对重边进行处理. 每次加入一条边之后,在这条搜索树上两个点的公共祖先都上所有点的桥都没了. 这里重边的 ...

  6. 【转】android开发中如何结束所有的activity

    原文网址:http://java--hhf.iteye.com/blog/1826880 每一个activity都有自己的生命周期,被打开了最终就要被关闭. 四种结束当前的activity方法 //关 ...

  7. 暴力求解——除法 Division,UVa 725

    Description Write a program that finds and displays all pairs of 5-digit numbers that between them u ...

  8. 【索引】Android相关的

    Eclipse开发环境 JDK的下载和安装:http://www.cnblogs.com/duxiuxing/p/4771901.html Android SDK的下载和安装:http://www.c ...

  9. UVALive 5983 MAGRID

    题意:在一个n*m的网格上,从(0,0)走到(n-1,m-1),每次只能向右或者向下走一格.一个人最初有一个生命值x,走到每一个格生命值会变为x + s[i][j],(s[i][j]可为负,0,正), ...

  10. UVALive 5990 Array Diversit

    题意:对于一个数列A,substring是一个连续子串,subsequence是其非连续子序列.对于一个数字序列,记它的diversity是它的最大元素减去最小元素的差.给出一个数字序列,求与它div ...