美文网首页
node之URL模块

node之URL模块

作者: imakan | 来源:发表于2018-11-07 15:58 被阅读0次

    WHATWG URL的origin属性包括protocolhost,但不包含usernamepassword

    ┌─────────────────────────────────────────────────────────────────────────────────────────────┐
    │                                            href                                             │
    ├──────────┬──┬─────────────────────┬─────────────────────┬───────────────────────────┬───────┤
    │ protocol │  │        auth         │        host         │           path            │ hash  │
    │          │  │                     ├──────────────┬──────┼──────────┬────────────────┤       │
    │          │  │                     │   hostname   │ port │ pathname │     search     │       │
    │          │  │                     │              │      │          ├─┬──────────────┤       │
    │          │  │                     │              │      │          │ │    query     │       │
    "  https:   //    user   :   pass   @ sub.host.com : 8080   /p/a/t/h  ?  query=string   #hash "
    │          │  │          │          │   hostname   │ port │          │                │       │
    │          │  │          │          ├──────────────┴──────┤          │                │       │
    │ protocol │  │ username │ password │        host         │          │                │       │
    ├──────────┴──┼──────────┴──────────┼─────────────────────┤          │                │       │
    │   origin    │                     │       origin        │ pathname │     search     │ hash  │
    ├─────────────┴─────────────────────┴─────────────────────┴──────────┴────────────────┴───────┤
    │                                            href                                             │
    └─────────────────────────────────────────────────────────────────────────────────────────────┘
    (请忽略字符串中的空格,它们只是为了排版需要)
    

    利用WHATWG API解析一个URL字符串

    const { URL } = require('url')
    const myURL = new URL('https://user:pass@sub.host.com:8080/p/a/t/h?query=string#hash')
    console.log(myURL)
    

    在浏览器中,WHATWG URL是全局可用的,而在Nodejs中,任何情况下打开或使用一个链接都必须事先引用‘URL’模块:require('url').URL

    通过node提供的API解析一个URL:

    const url = require('url')
    const myURL = url.parse('https://user:pass@sub.host.com:8080/p/a/t/h?query=string#hash');
    

    Class:URL

    注意:根据浏览器的约定,URL对象的所有属性都是在类的原型上实现为getter和settter,而不是作为对象本身的数据属性,因此,与「遗留的urlObjects[]」不同,在URL对象的任何属性,(例如)delete myURL.protocoldelete myURL.pathname等)上使用 delete 关键字没有任何效果,但仍返回true

    Constructor:new URL(input[,base])

    • input 要解析的输入URL
    • base 如果input 是相对 URL,则为要解析的基本URL
      通过将input解析到base上创建一个新的URL对象,如果base是一个字符串,则解析方法与new URL(base)
    const { URL } = require('url');
    const myURL = new URL('/foo', 'https://example.org/');
      // https://example.org/foo
    

    如果input或base是无效URLs,将会抛出TypeError。请注意给定值将被强制转换为字符串。例如:

    const { URL } = require('url');
    const myURL = new URL({ toString: () => 'https://example.org/' });
    

    如果URL中存在Unicode字符被使用Punycode算法自动转换为ASCII

    const { URL } = require('url');
    const myURL = new URL('https://你好你好');
      // https://xn--6qqa088eba/
    

    url.hash

    const { URL } = require('url');
    const myURL = new URL('https://example.org/foo#bar');
    console.log(myURL.hash);
      // 输出 #bar
    
    myURL.hash = 'baz';
    console.log(myURL.href);
      // 输出 https://example.org/foo#baz
    

    url.host

    获取及设置URL的主机(host)部分。

    const { URL } = require('url');
    const myURL = new URL('https://example.org:81/foo');
    console.log(myURL.host);
      // 输出 example.org:81
    
    myURL.host = 'example.com:82';
    console.log(myURL.href);
      // 输出 https://example.com:82/foo
    

    url.hostname

    获取及设置URL的主机名(hostname)部分。 url.host和url.hostname之间的区别是url.hostname不 包含端口。

    const { URL } = require('url');
    const myURL = new URL('https://example.org:81/foo');
    console.log(myURL.hostname);
      // 输出 example.org
    
    myURL.hostname = 'example.com:82';
    console.log(myURL.href);
      // 输出 https://example.com:81/foo
    

    url.href

    const { URL } = require('url');
    const myURL = new URL('https://example.org/foo');
    console.log(myURL.href);
      // 输出 https://example.org/foo
    
    myURL.href = 'https://example.com/bar';
    console.log(myURL.href);
      // 输出 https://example.com/bar
    

    获取href 属性的值等同于调用url.toString()

    url.origin

    const { URL } = require('url');
    const myURL = new URL('https://example.org/foo/bar?baz');
    console.log(myURL.origin);
      // 输出 https://example.org
    

    url.password

    获取及设置URL的密码(password)部分。

    const { URL } = require('url');
    const myURL = new URL('https://abc:xyz@example.com');
    console.log(myURL.password);
      // 输出 xyz
    
    myURL.password = '123';
    console.log(myURL.href);
      // 输出 https://abc:123@example.com
    

    url.pathname

    获取及设置URL的路径(path)部分

    const { URL } = require('url')
    const myURL = new URL('https://example.org/abc/xyz?123')
    console.log(myURL.pathname) //   /abc/xyz
    myURL.pathname = '/abcdef';
    console.log(myURL.href);
      // 输出 https://example.org/abcdef?123
    

    url.port

    获取及设置URL的端口(port)部分。

    const { URL } = require('url');
    const myURL = new URL('https://example.org:8888');
    console.log(myURL.port);
      // 输出 8888
    
    // 默认端口将自动转换为空字符
    // (HTTPS协议默认端口是443)
    myURL.port = '443';
    console.log(myURL.port);
      // 输出空字符
    console.log(myURL.href);
      // 输出 https://example.org/
    
    myURL.port = 1234;
    console.log(myURL.port);
      // 输出 1234
    console.log(myURL.href);
      // 输出 https://example.org:1234/
    
    // 完全无效的端口字符串将被忽略
    myURL.port = 'abcd';
    console.log(myURL.port);
      // 输出 1234
    
    // 开头的数字将会被当做端口数
    myURL.port = '5678abcd';
    console.log(myURL.port);
      // 输出 5678
    
    // 非整形数字将会被截取部分
    myURL.port = 1234.5678;
    console.log(myURL.port);
      // 输出 1234
    
    // 超出范围的数字将被忽略
    myURL.port = 1e10;
    console.log(myURL.port);
      // 输出 1234
    

    端口值可以被设置为数字或者包含数字的字符串,数字范围0~65535(包括)。为给定protocol的URL对象设置端口值将会导致port值变成空字符('')
    如果给port属性设置的值是无效字符串,但如果字符串以数字开头,那么开头部位的数字将会赋值给port,否则,包括如果数字超出上述要求的数字,将被忽略

    url.protocol

    获取及设置URL的协议(protocol)部分。

    const { URL } = require('url');
    const myURL = new URL('https://example.org');
    console.log(myURL.protocol);
      // 输出 https:
    
    myURL.protocol = 'ftp';
    console.log(myURL.href);
      // 输出 ftp://example.org/
    

    如果给protocol属性设置的值是无效值,那么该值将被忽略。

    url.search

    获取及设置URL的序列化查询(query)部分部分。

    const { URL } = require('url');
    const myURL = new URL('https://example.org/abc?123');
    console.log(myURL.search);
      // 输出 ?123
    myURL.search = 'abc=xyz';
    console.log(myURL.href);
      // 输出 https://example.org/abc?abc=xyz
    

    url.searchParams

    获取表示URL查询参数的URLSearchParams对象。该属性是只读的;使用url.search设置来替换URL的整个查询参数。请打开URLSearchParams文档来查看更多细节。

    url.username

    获取及设置URL的用户名(username)部分。

    const { URL } = require('url');
    const myURL = new URL('https://abc:xyz@example.com');
    console.log(myURL.username);
      // 输出 abc
    
    myURL.username = '123';
    console.log(myURL.href);
      // 输出 https://123:xyz@example.com/
    

    url.toString()

    URL对象上调用toString()方法将返回序列化的URL。返回值与url.hrefurl.toJSON()的相同。

    url.toJSON

    URL对象上调用toJSON()方法将返回序列化的URL。返回值与url.hrefurl.toString()的相同。

    const { URL } = require('url');
    const myURLs = [
      new URL('https://www.example.com'),
      new URL('https://test.example.org')
    ]
    console.log(JSON.stringify(myURLs))
    

    Class:URLSearchParams

    URLSearchParamsAPI接口提供URL query 部分的读写权限

    const { URL, URLSearchParams } = require('url');
    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
    

    相关文章

      网友评论

          本文标题:node之URL模块

          本文链接:https://www.haomeiwen.com/subject/tgkvxqtx.html