1. url模块
1.1. url的了解
url就是全球统一资源定位符
对网站资源的一种简洁表达形式,也称为网址
1.2. url的构成(重中之重)
一个url是一个结构化的字符串,他包含多个有意义的组成部分,当被解析时,会返回一个url对象
完整结构
协议://用户名:密码@主机名.名.域:端口号/目录名/文件名.扩展名?参数名=参数值#hash
http协议URL常见结构
协议://主机名.名.域/目录名/文件名.扩展名?参数名=参数值&参数名2=参数值2#hash
在通过req.url来获取完整url内容时,获取是包含queryString
例如:
http://127.0.0.1:3000/index.html?id=123#456
此时通过req.url, 获取的值为/index.html?id=123
也就是说querystring是属于req.url,但是hash不属于
但是我们此时要得到文件名的部分,我不想要querystring,此时可以用正则提炼,但是太麻烦了
因此Node给我们提供了内置的模块,url,path,querystring他们都可以服务于URL的识别
1.3. url模块
url模块提供了一些使用的函数,用于URL路径的处理与解析
要注意的是Node提供了两套不同API处理URL
先看一下旧API
1.3.1 url.parse 方法
parse方法,可以将req.url转成对象形式
语法
url.parse(urlStr [, parseQueryString])
参数介绍
- urlStr 必须 用于指定需要转化的URL 字符串
- parseQueryString 可选, 参数是一个布尔值, true表示将querystring转为对象, false, 不转为对象就是一个普通的查询字符串,默认值为false
使用示例
const http = require('http');
// 处理路径的url模块
const url = require('url');
// 创建一个服务器
http.createServer((req, res) => {
// 将req.url转为对象
var urlJson = url.parse(req.url)
console.log(urlJson);
res.end('');
}).listen(3000);
console.log("Server Start at 3000 port")
/*
http://127.0.0.1:3000/wuwei/index.html?id=123&name=wuwei#456
打印的部分:
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?id=123&name=wuwei',
query: 'id=123&name=wuwei',
pathname: '/wuwei/index.html',
path: '/wuwei/index.html?id=123&name=wuwei',
href: '/wuwei/index.html?id=123&name=wuwei'
}
*/
同时url.parse方法可以接受第二个参数,如果第二个参数是true,那么query属性的部分,会将querystring的部分转为对象,方便我们存入数据库
// 将req.url方法的第二个参数设置为true
var urlJson = url.parse(req.url,true);
console.log(urlJson);
res.end('');
/*
http://127.0.0.1:3000/wuwei/index.html?id=123&name=wuwei#456
打印的部分:
Url {
...
search: '?id=123&name=wuwei',
query: { id: '123', name: 'wuwei' },
...
}
*/
1.3.2 url.format 方法
format方法的参数就是 parse方法的结果对象, 用于将对象转为一个字符串
let str = url.format(
{
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?username=wuwei&password=123456',
query: 'username=wuwei&password=123456',
pathname: '/wuwei/index.html',
path: '/wuwei/index.html?username=wuwei&password=123456',
href: '/wuwei/index.html?username=wuwei&password=123456'
}
)
console.log(str)
// 结果 /wuwei/index.html?username=wuwei&password=123456
1.3.3 url.resolve(from,to)
语法
url.resolve(from,to)
参数介绍
- from 参数为基准路径
- to 参数为参考路径
两个路径都可以是绝对路径,或者相对路径, 最后返回合并后的路径
用to替换from路径的最后一个文件夹
const {resolve} = require('url');
console.log(resolve('/usr/local','node'))
//返回 /usr/node
//带上斜杠
console.log(resolve('/usr/local/','node'));
//可以理解成
console.log(resolve('/usr/local/*','node'));
//返回 /usr/local/node
如果to
带斜杠,如/node
;
直接放回/node
,因为斜杠表示根目录.
to
是绝对路径,直接返回to,如果不是绝对路径就和from
拼接,然后返回绝对路径.
另一套API
1.3.4 另一个则是通常使用在Web浏览器中,实现WHATWG URL Standard的API
WHARWG URL 是一套规范,规定url长什么样子
var url = require("url")
var u = "https://music.163.com:80/wuwei/index.html?id=123&name=qq/#/song";
console.log(new url.URL(u))
/*
URL {
href:
'https://music.163.com:80/wuwei/index.html?id=123&name=qq/#/song',
origin: 'https://music.163.com:80',
protocol: 'https:',
username: '',
password: '',
host: 'music.163.com:80',
hostname: 'music.163.com',
port: '80',
pathname: '/wuwei/index.html',
search: '?id=123&name=qq/',
searchParams: URLSearchParams { 'id' => '123', 'name' => 'qq/' }, // 参数对象
hash: '#/song'
}
*/
scheme://host.domain:port/path/filename?queryName=queryValue
说明
- scheme: 定义因特网的类型.最常见的是 http,https,ftp
- host : 定义主机(http 默认主机是www)
- domain: 定义域名,比如 baidu.com
- :port : 定义主机上的端口号(http 默认的端口号是80)
- path : 定义服务器上的路径(如果省略/,则文档必须位于网站的根目录中)
- filename : 定义文档/资源的名称,比如 index.html
- queryName : 查询字符串,url 中携带的数据 如果username=admin
2. querystring 模块
querystring模块有一个parse方法和url.parse()加true非常相似,就是把query的字符串部分转为对象
2.1 parse 方法使用方法
parse方法是将字符串解析为对象
querystring模块的parse方法接受四个参数
语法
querystring.parse(str[,sep] [,eq] [,options])
参数介绍
- str 参数是必须的, 就是制定被转换的查询字符串
- seq 可选, 指定分割字符 默认为'&' 一般不用
- eq 可选 指定查询字符串中的分配字符,默认 '=' 一般也不用
- options 可选 是一个配置对象, 通过配置maxkeys来指定解析后对象属性的个数(一般不用)
const http = require('http');
const url = require('url');
const path = require('path');
const querystring = require('querystring')
// 创建一个服务器
http.createServer((req, res) => {
// 将req.url转为对象
var urlJson = url.parse(req.url)
// 获取文件的路径
var pathname = urlJson.pathname;
// 获取文件的扩展名
var extname = path.extname(pathname);
// 获取查询字符串
var qs = urlJson.query;
// 将查询字符串转为对象,和url.parse()方法加true非常类似
var queryjson = querystring.parse(qs)
console.log(pathname);
console.log(extname);
console.log(qs);
console.log(queryjson);
res.end('');
}).listen(3000);
console.log("Server Start at 3000 port")
/*
http://127.0.0.1:3000/wuwei/index.html?id=123&name=wuwei#456
打印的部分:
/wuwei/index.html
.html
id=123&name=wuwei
{ id: '123', name: 'wuwei' }
*/
就会发现querystring和path模块都是服务于url模块的
2.2 stringify 方法
stringify 方法用于将对象转为特定的字符串拼接的方式
string方法,接受三个参数
语法
querystring.stringify(obj [,sep] [,eq])
参数介绍
- obj 必须 用于指定被转换的对象
- sep 可选 表示指定查询字符串中所使用的分割字符串, 默认为 & 一般不用
- eq 可选 用于指定查询字符串中使用的分配字符 默认为 = 一般不用
2.3 escape 方法
将中文以及其他符号转义
const querystring = require('querystring')
let str = querystring.escape("你好")
console.log(str); // %E4%BD%A0%E5%A5%BD
2.4 unescape 方法
将转义后的字符反转义
const querystring = require('querystring')
let str = querystring.escape("%E4%BD%A0%E5%A5%BD")
console.log(str); // 你好
3. path路径模块
NodeJs中,提供了一个path模块,在这个模块中,提供了许多实用的,可被用来处理与转换文件路径的方法及属性
用于格式化或拼接一个完整的路径
引入path模块
const path = require('path');
console.log(path)
path
是一个对象
3.1. path常用 方法和属性
3.1.1 path.join()
这个方法主要用来拼接路径.返回相对路径\
拼接路由地址尽量使用join(‘ ’)
方法,因为不同的操作系统会使用不同的连接符
作用:
将多个路径拼接成一个完成的路径
var path = require('path');
var p2 = "./wuwei/aa/index.html";
console.log(path.join("code", p2))
// 常用的
console.log(path.join(__dirname, p2))
这里使用了全局变量__dirname
全局变量
__dirname
当前文件的所在文件夹的路径(绝对路径)
__filename
当前运行的文件(当前文件的整体路劲)
console.log(path.join('a','b'));
//返回
a/b //路径拼接
//可以接受多个参数
console.log(path.join('a','b','c'));
//返回
a/b/c //路径拼接
//会自动识别
console.log(path.join('a','/b','/c'));
//返回
a/b/c //路径拼接
console.log(path.join('a','./b','./c'));
//返回
a/b/c //路径拼接
console.log(path.join('a','./b','..'));
a
3.1.2 path.resolve()
这个方法也是用来拼接路径的,但是返回的是绝对路径,尽量少用
console.log(path.resolve('a'))
//返回绝对路径
/Users/fy/Desktop/a
console.log(path.resolve(__dirname,'test'))
// 获取路径信息的一组
3.1.3 path.dirname()
返回路径中的文件夹部分
var path = require('path')
var p2 = "./wuwei/aa/index.html";
console.log(path.dirname(p2)); // ./wuwei/aa
3.1.4 path.basename()
返回路径中的文件部分(包含文件名和扩展名)
var path = require('path')
var p2 = "./wuwei/aa/index.html";
console.log(path.basename(p2)) // index.html
3.1.5 path.extname()
返回路径中的扩展名
var path = require('path')
var p2 = "./wuwei/aa/index.html";
console.log(path.extname(p2)) // .html
// 把路径拆分,已经合并路径的一组
3.1.6 path.parse()
解析路径: 返回包含路径各部分信息的对象
var path = require('path')
var p2 = "./wuwei/aa/index.html";
console.log(path.parse(p2));
/*
{ root: '',
dir: './wuwei/aa',
base: 'index.html',
ext: '.html',
name: 'index' }
*/
例子:
const http = require('http');
const fs = require('fs');
// 处理路径的url模块
const url = require('url');
// 处理文件路径工具的模块
const path = require('path');
// 创建一个服务器
http.createServer((req, res) => {
// 将req.url转为对象
var urlJson = url.parse(req.url, true)
// 获取文件的路径
var pathname = urlJson.pathname;
// 获取文件的扩展名
var extname = path.extname(pathname);
console.log(pathname);
console.log(extname)
res.end('');
}).listen(3000);
console.log("Server Start at 3000 port")
/*
http://127.0.0.1:3000/wuwei/index.html?id=123&name=wuwei#456
打印的部分:
/wuwei/index.html
.html
*/
我们可以使用解构的方式来使用这些方法
const {join} = require("path")
//这样解构后就可以直接使用
//join 来替代 path.json