Web相关模块
1、url和querystring模块
1.1、url模块
url模块主要用于对URL地址进行解析,使用该模块时,需要使用require()函数进行引入,其语法格式如下:
js
const url=require('url')
常用方法:
parse():将url字符串转换成url对象format(urlObj):将url对象转换成url字符串resolve(from,to):为url插入或替换原有的标签
下面代码使用url模块的parse()方法将一个url网址转换成url对象,代码如下:
js
//使用url模块
const url = require('url');
//调用parse方法
let parsedObject = url.parse('https://www.mingrisoft.com/systemCatalog/26.html');
console.log(parsedObject);
json
Url {
protocol: 'https:',
slashes: true,
auth: null,
host: 'www.mingrisoft.com',
port: null,
hostname: 'www.mingrisoft.com',
hash: null,
search: null,
query: null,
pathname: '/systemCatalog/26.html',
path: '/systemCatalog/26.html',
href: 'https://www.mingrisoft.com/systemCatalog/26.html'
}
protocol:协议。slashes:是否含有协议的"//"。auth:认证信息,如果有密码,为usrname:passwd,否则为null。host:IP地址、域名或主机名。port:端口(默认8080不显示)。hostname:主机名字。hash:锚点值。search:查询字符串参数,包含"?"。query:查询字符串参数,不包含"?"。pathname:访问的资源路径名。path:访问的资源路径。href:完整的url地址。
1.2、querystring模块
querystring模块用于实现URL参数字符串与参数对象之间的互相转换,其引入语法如下:
js
const querystring=require('querystring')
主要方法:
stringify():将对象(通常是JSO对象)转换成URL查询字符串parse():将URL查询字符串转换成对象(通常是JSON对象)
例如,下面代码首先使用url模块将一个网址转换为url对象,然后使用querystring模块的parse()方法获取url中的查询字符串,并转换为JSON对象进行输出,代码如下:
js
//使用url模块和querystring模块
const url = require('url');
const querystring = require('querystring');
let parsedObject =
url.parse('https://search.jd.com/Search?keyword=java&enc=utf-8&wq=java&pvid=425de9f31d014547807ff3ab31e81af1');
console.log(querystring.parse(parsedObject.query));
json
[Object: null prototype] {
keyword: 'java',
enc: 'utf-8',
wq: 'java',
pvid: '425de9f31d014547807ff3ab31e81af1'
}
2、http模块
http模块允许Node.js通过超文本传输协议(HTTP)传输数据,它使开发Web应用变得更加容易,要使用http模块,首先需要使用下面代码引入它:
js
let http = require('http');
2.1、server对象
server对象用来创建一个服务。在Node.js中,使用http模块中的createServer()方法,可以创建一个server对象,代码如下:
js
let server = require('http').createServer();
server对象中主要使用的方法有listen()方法和close()方法,如表所示,它们分别控制着服务器的启动和结束。
| 方法 | 说明 |
|---|---|
| listen(port) | 启动服务器 |
| close() | 关闭服务器 |
端口(port)是计算机与计算机之间信息的通道。计算机中的端口从0开始,一共有65535个端口。
例如,首先创建一个server服务对象,并使用其listen()方法启动一个端口号为52273的本地地址,运行10秒后,使用server服务对象的close()方法关闭服务器。代码如下:
js
//创建server对象
const server = require('http').createServer();
//启动服务器,监听52273端口
server.listen(52273, function () {
console.log('服务器监听地址是 http://127.0.0.1:52273');
});
//10秒后执行close()方法
let test = function () {
//关闭服务器
server.close();
};
setTimeout(test, 10000);
2.2、response对象
response对象用来输出响应内容,发送给客户端,该对象常用的方法如下:
writeHead(statusCode[,statusMessage][,headers]):返回响应头信息。参数说明如下。- statusCode:接收数字类型的状态码。
- statusMessage:接收任何显示状态消息的字符串。
- headers:接收任何函数、数组或字符串。
end([data][,encoding]):返回响应内容。参数说明如下。- data:执行完毕后要输出的字符。
- encoding:对应data的字符编码。
例如,使用http模块的createServer()方法创建一个服务,在其中使用response对象中的writeHead()方法和end()方法获取服务器的响应内容,代码如下:
js
//创建Web服务器,并监听52273端口
require('http').createServer(function (request, response) {
//返回响应内容
response.writeHead(200, { 'Content-Type': 'text/html' });
response.end('<h1>Hello,Node.js</h1>');
}).listen(52273, function () {
console.log('服务器监听地址是 http://127.0.0.1:52273');
});

2.2.1、响应HTML文件
上面的示例中,我们直接在end()方法中编写响应内容<h1>Hello,Node.js</h1>并返回给客户端。但是实际开发中,不可能把所有内容都写在end()方法中,比如我们可以响应一个编写好的HTML文件,可以使用fs模块的readFile()方法读取其内容,然后通过end()方法去响应读取到的HTML文件内容并返回给客户端。
将HTML文件返回给客户端:
- 新建一个index.html文件,其中使用<h1>标签和<pre>标签输出一个404页面的字符画,该文件中的内容主要用作响应内容,代码如下:
html
<!DOCTYPE html>
<html>
<head>
<!--指定页面编码格式-->
<meta charset="UTF-8">
<!--指定页头信息-->
<title>特殊文字符号</title>
</head>
<body>
<!--表示文章标题-->
<h1 align="center">汪汪!你想找的页面让我吃喽!</h1>
<!--绘制可爱小狗的字符画-->
<pre align="center">
.----.
_.'__ `.
.--($)($$)---/#\
.' @ /###\
: , #####
`-..__.-' _.-\###/
`;_: `"'
.'"""""`.
/, hi ,\\
// 你好! \\
`-._______.-'
___`. | .'___
(______|______)
</pre>
</body>
</html>
- 新建一个.js文件,该文件中使用createServer()方法创建一个Web服务器,然后使用fs模块的readFile()方法读取index.html的内容,存储到变量data中,最后通过response对象中的end()方法输出给客户端。代码如下:
js
//引入模块
const fs = require('fs');
const http = require('http');
//创建服务器
http.createServer(function (request, response) {
//读取HTML文件内容
fs.readFile('index.html', function (error, data) {
response.writeHead(200, { 'Content-Type': 'text/html' });
response.end(data);
});
}).listen(52273, function () {
console.log('服务器监听地址是 http://127.0.0.1:52273');
});

2.2.2、响应多媒体文件
js
//引入模块
const fs = require('fs');
const http = require('http');
//创建服务器,监听52273端口
http.createServer(function (request, response) {
//读取图片文件
fs.readFile('demo.jpg', function (error, data) {
response.writeHead(200, { 'Content-Type': 'image/jpeg' });
response.end(data);
});
}).listen(52273, function () {
console.log('服务器监听位置是 http://127.0.0.1:52273');
});
//创建服务器,监听52274端口
http.createServer(function (request, response) {
//读取视频文件
fs.readFile('JavaScript.mp4', function (error, data) {
response.writeHead(200, { 'Content-Type': 'video/mpeg4' });
response.end(data);
});
}).listen(52274, function () {
console.log('服务器监听位置是 http://127.0.0.1:52274');
});
2.2.3、网页自动跳转
在访问网站时,网页自动跳转是经常出现的情形之一,在Node.js中,实现该功能需要使用响应信息头的Location属性来指定要跳转的地址。
js
//引入模块
const http = require('http');
//创建服务器,实现网页自动跳转
http.createServer(function (request, response) {
response.writeHead(302, { 'Location': 'https://www.baidu.com/' });
response.end();
}).listen(52273, function () {
console.log('服务器监听地址在 http://127.0.0.1:52273');
});
2.3、request对象
request对象表示HTTP请求,包含了请求查询字符串、参数、内容、HTTP头等属性,其常用属性如表所示。
| 属性 | 说明 |
|---|---|
method |
返回客户端请求方法 |
url |
返回客户端请求url |
headers |
返回请求信息头,可能包含以下值: content--type:请求携带的数据的类型 accepta:客户端可接受文件的格式类型 user-agent:客户端相关的信息 content-length:文件的大小和长度 host:主机地址 |
trailers |
返回请求网络 |
httpVersion |
返回HTTP协议版本 |
HTTP请求有两种,分别是GET请求和POST请求。其中,GET请求用来获取数据,POST请求用来提交数据。
对于我们来说,分辨这两种请求的最直观的方法就是:GET把参数包含在URL中,比如通过浏览器的地址栏直接输入访问某个网址,就是GET请求;POST通过requestbody传递参数,比如输入用户名和密码登录某个网站,就是POST请求。
示例:request对象的使用
- 创建一个login.html文件,该文件为一个基本的用户登录页面。代码如下:
html
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>用户登录</title>
<style>
body {
font: 13px/20px 'Lucida Grande', Tahoma, Verdana, sans-serif;
color: #404040;
background: #0ca3d2;
}
.container {
margin: 80px auto;
width: 640px;
}
/*篇幅原因,此处省略部分CSS代码*/
</style>
</head>
<body>
<section class="container">
<div class="login">
<h1>用户登录</h1>
<form method="post">
<p><input type="text" name="login" value="" placeholder="用户名"></p>
<p><input type="password" name="password" value="" placeholder="密码"></p>
<p class="remember_me">
<label>
<input type="checkbox" name="remember_me" id="remember_me">
记住密码
</label>
</p>
<p class="submit"><input type="submit" name="commit" value="登录"></p>
</form>
</div>
</section>
</body>
</html>
- 新建一个js.js文件,该文件中通过request对象的method属性对GET和POST请求进行判断。如果是GET请求,直接访问页面;如果是POST请求,则显示POST请求提交的数据。代码如下:
js
//引入模块
const http = require('http');
const fs = require('fs');
//创建服务器
http.createServer(function (request, response) {
if (request.method == 'GET') {
//GET请求
fs.readFile('login.html', function (error, data) {
response.writeHead(200, { 'Content-Type': 'text/html' });
response.end(data);
});
} else if (request.method == 'POST') {
//POST请求
request.on('data', function (data) {
response.writeHead(200, { 'Content-Type': 'text/html' });
response.end('<h1>' + data + '</h1>');
});
}
}).listen(52273, function () {
console.log('服务器监听地址是 http://127.0.0.1:52273');
});
4、path模块
4.1、path模块的常见操作
使用path模块之前需要引入该模块,代码如下:
js
let path=require("path");
4.1.1、获取文件所在目录
获取文件所在的目录,需要使用dirname()方法,其语法格式如下:
js
path.dirname(p)
参数p为字符串,表示路径(包含文件名)。示例代码如下:
js
const path = require("path")
let pa = path.dirname("/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js")
console.log(pa)
/Users/acton_zhang/前端/vscodeworkspace/node/demo
4.1.2、获取文件名
获取指定路径中的文件名,需要使用basename()方法,其语法格式如下:
js
path.basename(p[,ext])
参数p为字符串,表示路径;ext为可选参数,表示文件的扩展名。示例代码如下:
js
const path = require("path")
let pa = path.basename("/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js")
console.log(pa);
index.js
如果将上面代码中的第2行修改如下:
js
const path = require("path")
let pa = path.basename("/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js", ".js")
console.log(pa);
index
4.1.3、获取扩展名
获取文件扩展名需要使用extname()方法,其语法格式如下:
js
path.extname(p)
参数p为字符串,用于指定一个路径。示例代码如下:
js
const path = require("path")
let pa = path.extname("/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js")
console.log(pa);
.js
示例:通过扩展名获取文件夹中的图片文件
js
var path = require("path")
var fs = require('fs');
var text = "media文件夹中的图片有"
fs.readdir('media', function (err, files) { //获取media文件夹中的所有文件
if (err) console.log('读取目录操作失败。'); //读取错误时的返回内容
else {
for (var i = 0; i < files.length; i++) { //通过for循环遍历每文件夹中的文件
//判断文件的扩展名
if (path.extname(files[i]) == ".jpg" || path.extname(files[i]) == ".png") {
text += path.basename(files[i]) + "、"
}
}
console.log(text)
}
});
4.1.4、解析路径的组成
path模块提供了parse()方法,可以将指定路径解析为一个路径对象,其语法格式如下:
js
path.parse(p)
参数p表示路径;该方法的返回值为一个路径对象,该对象有以下属性。
- root:路径所属的根盘符。
- dir:路径所属的文件夹。
- base:路径对应的文件名。
- ext:路径对应文件的扩展名。
- name:文件对应的文件名称(不包含扩展名)。
js
const path = require("path")
let pa = path.parse("/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js")
console.log(pa);
json
{
root: '/',
dir: '/Users/acton_zhang/前端/vscodeworkspace/node/demo',
base: 'index.js',
ext: '.js',
name: 'index'
}
4.1.5、从对象返回路径字符串
path模块中提供了一个format()方法,该方法与parse()方法的功能正好相反,它可以将路径对象转换为路径字符串。其语法格式如下:
js
path.format(pathObject)
参数pathObject为路径对象,为其添加属性时,需要遵循以下优先级。
- dir属性高于root属性,所以同时出现dir属性和root属性时,忽略root属性。
- base属性高于name属性和ext属性,所以当base属性出现时,忽略name属性和ext属性。
例如,分别定义3个路径对象,其中设置不同的属性值,最后使用path模块的format()方法将这3个路径对象转换为字符串输出,代码如下:
js
const path = require("path")
pathObj1 = {
root: 'D:\\',
dir: "D:\\demo\\images",
base: 'a.png',
name: 'a',
ext: '.png'
}
pathObj2 = {
dir: "D:\\demo\\images",
base: 'a.png',
}
pathObj3 = {
dir: "D:\\demo\\images",
name: 'a',
ext: '.png'
}
console.log(path.format(pathObj1))
console.log(path.format(pathObj2))
console.log(path.format(pathObj3))
json
D:\demo\images/a.png
D:\demo\images/a.png
D:\demo\images/a.png
4.1.6、判断路径是否为绝对路径
path模块提供了isAbsolute()方法,用于判断路径是否为绝对路径,其语法格式如下:
js
path.isAbsolute(p)
参数p为字符串,表示路径。返回值有true和false,当路径为绝对路径时,返回值为true,反之为false。
例如,新建js.js文件,在该文件中添加两个路径,然后判断其是否为绝对路径,代码如下:
js
const path = require("path")
let pa1 = "D:\\Demo\\js.js"
let pa2 = "..\\Demo\\js.js"
console.log(path.isAbsolute(pa1))
console.log(path.isAbsolute(pa2))
true
false
4.1.7、将路径解析为绝对路径
使用path.resolve()方法可以将路径解析为绝对路径,其语法格式如下:
js
path.resolve([...paths])
参数paths为路径或者路径序列,即可以有一个也可以是多个。使用该方法时,需要注意以下3点。
- 给定的路径序列会从右到左进行处理,后面的每个path会被追加到前面,直到构造出绝对路径。例如下面代码:
js
path.resolve("E:","目录1","目录2","目录3")
//E:\目录1\目录2\目录3
- 如果resolve()方法中的路径序列经处理后无法构造成绝对路径,则处理后的路径序列会自动追加到当前工作目录。例如下面代码:
js
path.resolve("目录1","目录2","目录3")
//D:\Demo\11\07\目录1\目录2\目录3
- 如果参数值为空,则返回当前工作路径。示例代码如下:
js
path.resolve()
//D:\Demo\11\07
示例:使用resolve()方法处理路径片段。
创建js.js文件,在该文件中定义4个路径字符串,然后通过resolve()方法,将其解析为不同的绝对路径。代码如下:
js
const path=require("path")
let pa1="E:"
let pa2="media"
let pa3="a.mp4"
let pa4="..\\07"
console.log(path.resolve(pa2,pa3))
console.log(path.resolve(pa1,pa2,pa3))
console.log(path.resolve(pa4,pa2,pa3))
/Users/acton_zhang/前端/vscodeworkspace/node/demo/media/a.mp4
/Users/acton_zhang/前端/vscodeworkspace/node/demo/E:/media/a.mp4
/Users/acton_zhang/前端/vscodeworkspace/node/demo/..\07/media/a.mp4
4.1.8、将路径转换为相对路径
path模块提供了relative()方法可以将路径转换为相对路径,其语法格式如下:
js
path.relative(from,to)
参数from和to都是字符串,用来传入两个路径。该方法可以根据当前工作目录返回from到to的相对路径。如果from和to各自解析到相同的路径,则返回空字符串。
js
const path = require("path");
let pa1 =" D:\\Demo\\11";
let pa2 = "D:\\Demo\\11\\js.js";
console.log(path.relative(pa1,pa2));
console.log(path.relative(pa1,pa1));
通过上面的结果可以看到,当from和to路径相同时,其返回值为空。
js.js
示例:将列表中的绝对路径转换为相对路径
js
var path = require("path");
pathList = ["D:\\mydiro\\index.html",
"..\\images\\a.png",
"D:\\mydiro\\images\\b.jpg",
"D:\\mydiro\\js\\bootstrap.min.js",
"..\\js\\main.js",
"D:\\mydiro\\css\\bootstrap.min.css",
"..\\css\\main.css"
]
var text1="所有路径如下:"
var text2=""
for (var i = 0; i < pathList.length; i++) {
text1 += pathList[i] + "\t";
if (path.isAbsolute(pathList[i])) {
text2 += pathList[i] + " 为绝对路径,将其转换为相对路径为:" + path.relative(pathList[0], pathList[i]) + "\n"
}
}
console.log(text1 + "\n")
console.log(text2)

4.1.9、多路径的拼接
path模块中的join()方法连接路径(使用平台特定的路径分隔符,POSIX系统是/,Windows系统是\),其语法格式如下:
js
path.join([...paths])
上述语法中,参数paths为多个路径片段。示例代码如下:
js
const path=require("path")
let pa1="\\images"
let pa2="a.png"
let pa3="..\\video.mp4"
console.log(path.join(pa1,pa2))
console.log(path.join(pa1,pa2,pa3))
\images\a.png
\images\video.mp4
4.1.10、规范化路径
path模块中的normalize()方法可用于解析和规范化路径,当路径中包含".""...""\""/"之类的相对说明符时,该方法会尝试分析实际的路径。normalize()方法的语法格式如下:
js
path.normalize(p)
参数p用于指定路径字符串。
例如,使用normalize()方法对含有".""...""\""/"等相对说明符的路径进行解析,代码如下:
js
var path = require("path")
pa1 = "D:/demo/11/js.js"
pa2 = "D:/\\demo\\/11/\\js.js"
pa3 = "D:\\demo\\11\\js.js"
pa4 = "..\\demo\\a.mp4"
pa5 = ".\\demo\\a.mp4"
pa6 = "../demo/a.mp4"
pa7 = "./demo/a.mp4"
console.log(path.normalize(pa1))
console.log(path.normalize(pa2))
console.log(path.normalize(pa3))
console.log(path.normalize(pa4))
console.log(path.normalize(pa5))
console.log(path.normalize(pa6))
console.log(path.normalize(pa7))
D:\Demo\11\10>node js.js
D:\demo\11\js.js
D:\demo\11\js.js
D:\demo\11\js.js
..\demo\a.mp4
demo\a.mp4
..\demo\a.mp4
demo\a.mp4
4.2、path模块的属性
path模块除提供方法执行一些常见的文件及路径操作外,还提供了一些属性,这里了解即可,具体如下。
path.delimiter:提供平台特定的路径定界符,其值有";"和":"。如果在POSIX(portable operating systeminterface,可移植操作系统接口)平台上,其为":";如 果在Windows平台上,其为";"。path.sep:提供平台特定的路径片段分隔符,其值有"\"和"/"。如果在POSIX平台上,其值为"/";如果在Windows平台上,其值为"\"。path.posix:提供特定于POSIX平台的path方法的访问。path.win32:提供特定于Windows平台的path方法的访问。