nodejs概论(实操篇)
什么是模块?
模块分为原生模块(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概论(实操篇)的更多相关文章
- HDFS集群PB级数据迁移方案-DistCp生产环境实操篇
HDFS集群PB级数据迁移方案-DistCp生产环境实操篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 用了接近2个星期的时间,终于把公司的需要的大数据组建部署完毕了,当然,在部 ...
- ESP8266 NodeMCU小白手把手入门(实操篇)以土壤湿度和DHT传感器为例讲解读取传感器的值
物联网使得现实世界中的实体和数字世界比以往任何时候都更紧密地联系在一起.NodeMCU作为其中的一个重要设备,作用之一就是与传感器相连以实现万物互联通讯.这篇关于NodeMCU的实操篇以土壤湿度传感器 ...
- Linux实操篇
一:用户管理.群组管理 增: 1.指定群组添加账户: groupadd test 创建test用户组useradd -g test(用户组) xiaoming(用户名) ---- 创建us ...
- Linux实操篇 vi和vim编辑器
vi和vim的基本介绍 所有的Linux系统都会内建vi文本编辑器. vim具有程序编辑的能力,可以看做是vi的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计.代码补完.编译及错误跳转等 ...
- python 学习分享-购物车实操篇
程序要求如下: '''购物车程序: 启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就 ...
- 使用Jenkins与Docker持续集成与发布NetCore项目(实操篇)
使用Jenkins与Docker持续集成与发布NetCore项目(教程一) 原文地址:https://www.cnblogs.com/Jackyye/p/12588182.html 基本环境 该教程的 ...
- 02_Linux实操篇
第五章 VI和VIM编辑器 5.1. VI和VIM基本介绍 Vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器.由于对Unix及Linux系统的任何版本,Vi ...
- redis实操-sentinel
本文主要记录一些操作步骤,作为自己学习的一个记录,也供虚拟机上学习redis的人参考. 实操篇,可以参考 http://redis.cn/ 主从复制实操 在test目录下新建配置进行练习 1.mkdi ...
- Kafka集群优化篇-调整broker的堆内存(heap)案例实操
Kafka集群优化篇-调整broker的堆内存(heap)案例实操 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看kafka集群的broker的堆内存使用情况 1>. ...
随机推荐
- 利用js制作html table分页示例(js实现分页)
有时候table的列数太长,不利于使用者查询,所以利用JS做了一个table的分页,以下为相关代码 一.JS代码 <script type="text/javascript" ...
- VS2012中使用编译的Qt-5.1.1静态库开发程序
1. 安装qt-vs-addin-1.2.2-opensource.exe,安装之后,vs2012菜单栏就会出现QT5菜单. 2. 在qt-vs-addin添加Qt5静态库: QT5->Qt O ...
- Linux&shell之Shell脚本
写在前面:案例.常用.归类.解释说明.(By Jim) 使用多条命令shell脚本的关键是可以输入多条命令,甚至可以将一条命令的结果传递给另一条命令.date;who(两个命令shell脚本的写法) ...
- 「Poetize8」Divisible
描述 Description 设F[i]为斐波那契数列的第i项,F[1]=1,F[2]=1,F[i]=F[i-1]+F[i-2](i>=3). 输入格式 InputFormat 输入包含若干行( ...
- Simplify Path——LeetCode
Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/", ...
- [Locked] Binary Tree Vertical Order Traversal
Binary Tree Vertical Order Traversal Given a binary tree, return the vertical order traversal of its ...
- www.chenbowenblog.com 博客地址转移
我的新博客地址是 www.chenbowenblog.com 欢迎来访.
- Jenkins 六: 构建中执行shell或者 windows的批处理程序
Shell/ bat Jenkins 可以在构建中执行shell命令或者windows的batch 命令. 1. 选择一个项目,点击“配置”. 2. 找到“构建” –> “增加构建步骤”.选择 ...
- iPhone应用中如何避免内存泄露?
如何有效控制iPhone内存管理的对象的所有权与引用计数和以及iPhone内存的自动释放与便捷方法.本文将介绍在iPhone应用中如何避免内存泄露.想了解“在iPhone应用中如何避免内存泄露”就必须 ...
- hdu 3553 Just a String (后缀数组)
hdu 3553 Just a String (后缀数组) 题意:很简单,问一个字符串的第k大的子串是谁. 解题思路:后缀数组.先预处理一遍,把能算的都算出来.将后缀按sa排序,假如我们知道答案在那个 ...