nodejs 3 模块
程序员文章站
2022-06-29 17:42:44
...
模块分为2大类: 原生模块和文件模块
- 原生模块: node.js api提供的原生模块,在启动时就已经被加载。
- 文件模块: 动态加载模块,加载文件模块时需要通过原生模块module来实现和完成。
原生模块调用
应用node.js提供的api require来加载相应的node.js模块,require加载成功后会返回一个node.js模块的对象,该对象拥有该模块的所有属性和方法。
var httpModule = require("http");
- http: node.js提供的原生模块
- httpModule: require后返回的对象,通过该对象可调用http模块的所有属性和方法。
httpModule.createServer(function(req, res) {
//some code
}).listen(port);
文件模块调用
var test = require('/path/../test.js')
//var test = require('/path/../test')
注意:
- require的路径为绝对路径或相对路径
- 返回值为require的文件抛出的对象
- 只有exports和module.exports对象暴露给外部的属性和方法,才能通过返回的require对象进行调用。
//test.js
exports.name = "zula"; //exports name
exports.happy = function() {console.log("zula is xiaoxiannv")}; //exports happy function
var yourName = "reader";
function love() {
console.log(yourName + "love zula" );
}
//app.js
var test = require("./test.js");
console.log(test);
//终端输出
{ name: 'zula', happy: [Function] }
实现web解析DNS
【1】 创建parse_dns_ex.js,加载需要的node.js原生模块
- web的http服务器:http模块
- dns解析: dns模块
- 读取html页面:fileSystem模块
- 处理请求参数:querystring模块
//parse_dns_ex.js
var http = require("http"); //服务器创建
dns = require("dns"); //dns查询
fs = require("fs"); //文件操作
url = require("url"); //url处理
querystring = require("querystring"); //字符串处理
【2】 parse_dns_ex.js添加http服务器代码,返回显示index.html
http.createServer(function(req, res) {
//添加http请求头信息, 返回html, Content-Type = html
res.writeHead(200, { "Content-Type": "text/html" });
//获取html文件的路径
var readPath = __dirname + "/" + url.parse("index.html").pathname;
//同步读取index.html内容
var indexPage = fs.readFileSync(readPath);
//返回
res.end(indexPage);
}).listen(3000, "127.0.0.1");
<!--index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>dns查询</title>
<meta http-equiv="content-type" content="text/html; charset=urf-8">
</head>
<body>
<h1 style="text-align: center;">dns查询工具</h1>
<div style="text-align: center;">
<!-- 提交到http://127.0.0.1:3000/parse -->
<form action="/parse" method="post">
查询dns: <input type="text" name="search_dns">
<input type="submit" value="查询">
</form>
</div>
</body>
</html>
【3】 运行parse_dns_ex.js parse_dns_ex.js
打开浏览器输入http://127.0.0.1:3000
【4】 新增处理/parse请求路由
添加对http://127.0.0.1:3000/parse
的请求处理
http.createServer(function(req, res) {
var pathname = url.parse(req.url).pathname; //获取当前请求资源的url路径, 例如"/parse"
req.setEncoding("utf8"); //设置返回客户端页面的数据格式
router(req, res, pathname); //调用router方法处理url路由
}).listen(3000, "127.0.0.1");
//router(req, res, pathname);
function router(req, res, pathname) {
switch (pathname) { //根据pathname不同,执行不同的处理逻辑
case "/parse" :
parseDns(req, res);
break;
default:
goIndex(req, res);
}
}
/**
* [goIndex 定义响应html页面的函数]
* @Author zhulu
* @Date 2017-09-13
* @param {[object]} req [http请求对象]
* @param {[object]} res [http响应对象]
*/
function goIndex(req, res) {
//添加http请求头信息, 返回html, Content-Type = html
res.writeHead(200, { "Content-Type": "text/html" });
//获取html文件的路径
var readPath = __dirname + "/" + url.parse("index.html").pathname;
//同步读取index.html内容
var indexPage = fs.readFileSync(readPath);
//返回
res.end(indexPage);
}
/**
* [parseDns 解析客户端传递来的域名,并返回显示该域名相应的ip]
* @Author zhulu
* @Date 2017-09-13
* @param {[object]} res [http请求对象]
* @param {[object]} req [http响应对象]
*/
function parseDns(req, res){
var postData = "";
//数据传递到服务器时触发的事件函数,读取客户端传递来的数据,添加到postData里。
req.addListener("data", function(postDataChunk) {
postData += postDataChunk;
});
//数据接收完成,end事件触发后执行dns域名解析
//getDns异步解析域名,执行完成后回调function(domain, addresses){}
req.addListener("end", function(postDataChunk) {
//http 相应html页面信息
var resData = 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=urf-8">\
</head>\
<div style="text-align: center;">\
Domain: <span style="text-align: center;">'+ domain +'</span>\
IP: <span style="text-align: center;">'+ addresses.join(",") +'</span>\
</div>\
</html>');
});
return;
});
}
function getDns(postData, callback) {
var domain = querystring.parse(postData).search_dns;
dns.resolve(domain, function(err, addresses) {
if (!addresses) {
addresses = [ "不存在域名" ];
}
callback(domain, addresses);
})
}
【5】 运行结果
]
重构dns解析网站
将业务处理分离,每个模块处理相应职责,避免业务混乱。利用文件模块,将系统分为不同的功能模块去实现和完成。
将系统分为: 服务器创建模块、路由处理模块、逻辑控制模块、数据处理模块、错误处理模块等。
dns解析系统分为: 仓库(喜欢请star(๑•ᴗ•๑))
-
入口模块index.js
创建http服务,加载router文件模块,分发请求资源
var http = require("http"); //服务器创建 url = require("url"); //url处理 var router = require("./router.js"); http.createServer(function(req, res) { var pathname = url.parse(req.url).pathname; //获取当前请求资源的url路径, 例如"/parse" req.setEncoding("utf8"); //设置返回客户端页面的数据格式 router.router(req, res, pathname); //调用router方法处理url路由 }).listen(3000, "127.0.0.1");
-
路由处理模块router.js
处理所有请求资源,分发到相应处理器。
var ParseDns = require("./parse_dns.js"); var MainIndex = require("./main_index.js"); exports.router = function (req, res, pathname) { switch (pathname) { //根据pathname不同,执行不同的处理逻辑 case "/parse" : ParseDns.parseDns(req, res); break; default: MainIndex.goIndex(req, res); } }
-
DNS解析模块parse_dns.js
dns逻辑处理
var dns = require("dns"), //dns查询 querystring = require("querystring"); //字符串处理 /** * [parseDns 解析客户端传递来的域名,并返回显示该域名相应的ip] * @Author zhulu * @Date 2017-09-13 * @param {[object]} res [http请求对象] * @param {[object]} req [http响应对象] */ exports.parseDns = function(req, res){ var postData = ""; //数据传递到服务器时触发的事件函数,读取客户端传递来的数据,添加到postData里。 req.addListener("data", function(postDataChunk) { postData += postDataChunk; }); //数据接收完成,end事件触发后执行dns域名解析 //getDns异步解析域名,执行完成后回调function(domain, addresses){} req.addListener("end", function(postDataChunk) { //http 相应html页面信息 var resData = 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=urf-8">\ </head>\ <div style="text-align: center;">\ Domain: <span style="text-align: center;">'+ domain +'</span>\ IP: <span style="text-align: center;">'+ addresses.join(",") +'</span>\ </div>\ </html>'); }); return; }); } //私有方法 function getDns(postData, callback) { var domain = querystring.parse(postData).search_dns; dns.resolve(domain, function(err, addresses) { if (!addresses) { addresses = [ "不存在域名" ]; } callback(domain, addresses); }) }
-
首页展示模块main_index.js
处理主页index.html页面展示
var fs = require("fs"), //文件操作 url = require("url"); //url处理 /** * [goIndex 定义响应html页面的函数] * @Author zhulu * @Date 2017-09-13 * @param {[object]} req [http请求对象] * @param {[object]} res [http响应对象] */ exports.goIndex = function(req, res) { //添加http请求头信息, 返回html, Content-Type = html res.writeHead(200, { "Content-Type": "text/html" }); //获取html文件的路径 var readPath = __dirname + "/" + url.parse("index.html").pathname; //同步读取index.html内容 var indexPage = fs.readFileSync(readPath); //返回 res.end(indexPage); }