Node.js——Web相关模块

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文件返回给客户端:

  1. 新建一个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>
  1. 新建一个.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对象的使用

  1. 创建一个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>
  1. 新建一个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方法的访问。
相关推荐
Amumu121383 小时前
工程化: webpack介绍和基础用法
前端·javascript·工程化
onebound_noah3 小时前
【实战解析】如何高效获取京东商品详情数据(含多语言SDK接入)
java·前端·数据库
SuperEugene3 小时前
前端组件三层架构:页面/业务/基础组件划分,高内聚低耦合|组件化设计基础篇
前端·javascript·vue.js·架构·前端框架·状态模式
迈巧克力3 小时前
用OpenClaw实现小红书自动发布:从零到一的完整技术方案
前端·人工智能·创业
givemeacar3 小时前
十七:Spring Boot依赖 (2)-- spring-boot-starter-web 依赖详解
前端·spring boot·后端
辻戋4 小时前
从零开始手写mini-webpack
前端·webpack·node.js
cch89184 小时前
PHP vs 易语言:Web开发与桌面编程大对决
开发语言·前端·php
百撕可乐4 小时前
NextJS官网实战02:项目的基础骨架搭建
前端·javascript·react.js
陈天伟教授4 小时前
人工智能应用- 人工智能风险与伦理:01.数据安全
前端·人工智能·安全·xss·csrf