什么是模块?

模块分为原生模块(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. The Suspects(简单的并查集)

    Description Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, wa ...

  2. Spring基础介绍

    Spring属于轻量级还是重量级框架?   这需针对使用Spring的功能而言,比如我们常使用其核心服务整合SSH,这样则为轻量级. 如果使用其大部分服务则可以理解为重量级.   普通JAVA项目环境 ...

  3. 【HDOJ】2405 Marbles in Three Baskets

    BFS+状态压缩. /* 2405 */ #include <iostream> #include <queue> #include <cstdio> #inclu ...

  4. 杂题 UVAoj 10000 Longest Paths

      Longest Paths  It is a well known fact that some people do not have their social abilities complet ...

  5. 使用 virtualenv

    关于virtualenv的资料: http://virtualenv-chinese-docs.readthedocs.org/en/latest/ 用的python3,但是搭建 Robot Fram ...

  6. VGO新闻 - VGO

    VGO新闻 - VGO VGO天津伊势丹店盛装揭幕 VGO天津伊势丹店盛装揭幕2013年9月7日,VGO(微高)全国首家实体店在天津伊势丹百货盛装开幕.现场,100多位商场领导及业内同仁共同出席了

  7. 遍历Map的几种方法

    public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...

  8. Atitit.hibernate体系结构大总结

    Atitit.hibernate体系结构大总结 1. 4.1 hibernate基础语义 80  4.1.1 configuration 80  4.1.2 sessionfactory 81  4. ...

  9. mybatis3温故

    MyBatis可以利用SQL映射文件来配置,也可以利用Annotation来设置.MyBatis提供的一些基本注解如下表所示. 注解 目标 相应的XML 描述 @CacheNamespace 类 &l ...

  10. [PWA] 4. Hijacking Request

    We want to do offline first, the first thing we need to do is we should able to catch the browser re ...