url是什么?简单的说url全球统一资源定位符,对网站资源的一种简洁表达形式,也称为网址。
现在看一下url格式的三个部分:
https://blog.csdn.net/u011863822?spm=1000.2115.3001.5343
还有可以在后面添加?后面是参数,尤其是get请求中参数更有意义。
而url模块就是帮忙处理url的一个模块,比如例子中的如何知道目录地址,以及域名可能处理的话需要用字符串分割等操作,但是url却可以帮忙我们更好的处理,现在看一下其常用的方法。
先体验一下:
var url= require('url')
const url_html='https://blog.csdn.net/u011863822?spm=1000.2115.3001.5343'
console.log(url.parse(url_html))
看输出了什么:

可以看出将网址请求,所以可以看出请求的所有地址的信息,不用自己去用正则或者分割字符串了,这个模块。
毕竟通过req.url 如果带有参数的话,就需要分割这个url字符串了,用这个之间通过pathname得到请求地址,岂不是很香。
其实可以有两个参数:
var url= require('url')
const url_html='https://blog.csdn.net/u011863822?spm=1000.2115.3001.5343'
console.log(url.parse(url_html,true))

可以看出query的参数变成了一个object,更加方便了。
既然能变成一个urlObject,自然也可以通过urlObject转换为一个url。
var url= require('url')
const urlobjct= {
protocol: 'https:',
slashes: true,
auth: null,
host: 'blog.csdn.net',
port: null,
hash: null,
search: '?spm=1000.2115.3001.5343',
query: 'spm=1000.2115.3001.5343',
pathname: '/u011863822',
path: '/u011863822?spm=1000.2115.3001.5343',
href: 'https://blog.csdn.net/u011863822?spm=1000.2115.3001.5343'
}
console.log(url.format(urlobjct))

格式:
resolve(from, to)
url.resolve() 方法以类似于 Web 浏览器解析锚标记的方式解析相对于基本 URL 的目标 URL。
还是老规矩演示,这个官网例子,直接用。
const url = require('url');
// 如果前面最后不是/ 后面也没有/ 就直接替换前面/后面的内容
url.resolve('/one/two/three', 'four'); // '/one/two/four'
// 如果前面最后是/ 后面也没有/ 就直接放在前面/后面
url.resolve('/one/two/three/', 'four'); // '/one/two/three/four'
// 如果后面有/ 就直接放在前面/后面域名后面
url.resolve('http://example.com/', '/one'); // 'http://example.com/one'
url.resolve('http://example.com/one', '/two'); // 'http://example.com/two'
看一下官网发现其提示是过时了

上面三个方法其实旧版的写法,当然既然说是旧版自然也有新版了,所以简单聊一下新版方法实现。
这个可以直接调用,而不用引用模块,
格式:
new URL(input[, base])
来一个例子:
const urlobjct=new URL('/u011863822?spm=1000.2115.3001.5343','https://blog.csdn.net')
console.log(urlobjct)

可以看出上面的结果和url.parse方法得到的结果一样,也可以根据自己的需求取出不同需要内容了。
const url = require('url');
// 如果前面最后不是/ 后面也没有/ 就直接替换前面/后面的内容
url.resolve('http://example.com/one/two/three', 'four'); // 'http://example.com/one/two/four'
// 如果前面最后是/ 后面也没有/ 就直接放在前面/后面
url.resolve('http://example.com/one/two/three/', 'four'); // 'http://example.com/one/two/three/four'
// 如果后面有/ 就直接放在前面/后面域名后面
url.resolve('http://example.com/', '/one'); // 'http://example.com/one'
url.resolve('http://example.com/one', '/two'); // 'http://example.com/two'
//上面可以变成:
let b_url=new URL('four', 'http://example.com/one/two/three');
console.log(b_url.href)
b_url=new URL('/four', 'http://example.com/one/two/three');
console.log(b_url.href)
b_url=new URL('/one', 'http://example.com/');
console.log(b_url.href)
b_url=new URL('/two', 'http://example.com/one');
console.log(b_url.href)
URLSearchParams API 提供对 URL 查询的读写访问。 URLSearchParams 类也可以与以下四个构造函数之一单独使用。 URLSearchParams 类也在全局对象上可用。
WHATWG URLSearchParams 接口和 querystring 模块具有相似的用途,但 querystring 模块的用途更通用,因为它允许自定义的分隔符(& 和 =)。 换句话说,此 API 纯粹是为网址查询字符串而设计。
看一官网的例子:
const myURL = new URL('https://example.org/?abc=123');
console.log(myURL.searchParams.get('abc'));
// 打印 123
myURL.searchParams.append('abc', 'xyz');
console.log(myURL.href);
// 打印 https://example.org/?abc=123&abc=xyz
myURL.searchParams.delete('abc');
myURL.searchParams.set('a', 'b');
console.log(myURL.href);
// 打印 https://example.org/?a=b
const newSearchParams = new URLSearchParams(myURL.searchParams);
// 以上相当于
// const newSearchParams = new URLSearchParams(myURL.search);
newSearchParams.append('a', 'c');
console.log(myURL.href);
// 打印 https://example.org/?a=b
console.log(newSearchParams.toString());
// 打印 a=b&a=c
// newSearchParams.toString() 是隐式调用的
myURL.search = newSearchParams;
console.log(myURL.href);
// 打印 https://example.org/?a=b&a=c
newSearchParams.delete('a');
console.log(myURL.href);
// 打印 https://example.org/?a=b&a=c
它有很多方法,还可以遍历参数如下:
格式:
urlSearchParams.forEach(fn[, thisArg])
补充:url.searchParams **获取表示网址查询参数的 URLSearchParams 对象。 **
来一个例子:
const urlobjct=new URL('https://blog.csdn.net/u011863822?a=A&b=B')
urlobjct.searchParams.forEach(
(value, key) => {
console.log(key,value)
});

还有urlSearchParams.sort()等方法,看名字就知道是什么意思了,不再继续演示。
看着和老版本的方法是似乎是一个,但是其多了参数。
格式:
url.format(URL[, options])
演示:
import url from 'url';
const myURL = new URL('https://a:b@測試?abc#foo');
console.log(myURL.href);
// 打印 https://a:b@xn--g6w251d/?abc#foo
console.log(myURL.toString());
// 打印 https://a:b@xn--g6w251d/?abc#foo
console.log(url.format(myURL, { fragment: false, unicode: true, auth: false }));
// 打印 'https://測試/?abc'
更多方法和参数可以看一下官网:http://nodejs.cn/api/url.html#url
格式如下:
querystring.parse(str[, sep[, eq[, options]]])
来一个例子体验一下:
const querystring= require('querystring')
const testpara='a=A&b=B'
console.log(querystring.parse(testpara))

格式:
querystring.stringify(obj[, sep[, eq[, options]]])
演示:
const querystring= require('querystring')
jsonObject={a:'A',b:'B'}
console.log (querystring.stringify(jsonObject))

在看一下官网的例子:
querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' });
// 返回 'foo=bar&baz=qux&baz=quux&corge='
querystring.stringify({ foo: 'bar', baz: 'qux' }, ';', ':');
// 返回 'foo:bar;baz:qux'
querystring.escape() 方法以针对网址查询字符串的特定要求优化的方式对给定的 str 执行网址百分比编码。
querystring.unescape() 方法在给定的 str 上执行网址百分比编码字符的解码。
querystring.escape() 方法被 querystring.stringify() 使用,通常不会被直接使用。 导出它主要是为了允许应用程序代码在必要时通过将 querystring.escape 分配给替代函数来提供替换的百分比编码实现。
querystring.unescape() 方法被 querystring.parse() 使用,通常不会被直接使用。 导出它主要是为了允许应用程序代码在必要时通过将 querystring.unescape 分配给替代函数来提供替代的解码实现。认情况下,querystring.unescape() 方法将尝试使用 JavaScript 内置的 decodeURIComponent() 方法进行解码。 如果失败,则将使用更安全的不会因格式错误的网址而抛出错误的同类方法。
演示:
const querystring= require('querystring')
const escape_str=querystring.escape('http://example.com/')
console.log(escape_str)
console.log(querystring.unescape(escape_str))
// 当然还可以作为sql语句前后端传递进行简单编码而防止简单的注入 。
