nodejs 3 模块
来源:互联网 发布:java syslog4j 编辑:程序博客网 时间:2024/05/21 02:19
模块分为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.jsexports.name = "zula"; //exports nameexports.happy = function() {console.log("zula is xiaoxiannv")}; //exports happy functionvar yourName = "reader";function love() { console.log(yourName + "love zula" );}//app.jsvar 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.jsvar 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);}
阅读全文
0 0
- nodejs 3 模块
- nodejs学习3-Event模块
- Nodejs 模块
- nodejs模块
- Nodejs 模块
- nodejs-模块
- NodeJS-模块
- NodeJS模块
- nodejs 模块
- nodejs模块
- Nodejs 模块
- (3)nodejs学习--系统模块
- nodejs 模块与es6模块
- nodejs模块之fs模块
- NodeJS 常用模块推荐
- nodejs event模块
- NodeJS 常用模块推荐
- nodejs文件夹遍历模块
- 在ListView中EditText丢失光标问题
- Android中动画的介绍以及使用
- ArcGIS Runtime for .Net Quartz开发探秘(四):加载本地文件
- dijkstra模板
- input内容改变后,ie11中change事件执行两次的解决办法
- nodejs 3 模块
- 读书笔记-06网站的伸缩架构
- Red Carpet Subscriptions发布2017 v3,适用于Linux和macOS的新版本
- 累
- 条件技术中需求公式的 kobed和kobev的不同之处
- easyui combobox 默认选中第一项
- Mybatis---代码自动生成(generatorConfig.xml配置)
- mac算法原理学习
- 【cuda】yolo2 windows vs2015 cuda cudnn