美文网首页
第七节: 内置模块(三): url模块与path模块

第七节: 内置模块(三): url模块与path模块

作者: 时光如剑 | 来源:发表于2020-12-19 19:25 被阅读0次

    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])

    参数介绍

    1. urlStr 必须 用于指定需要转化的URL 字符串
    2. 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)

    参数介绍

    1. from 参数为基准路径
    2. 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

    说明

    1. scheme: 定义因特网的类型.最常见的是 http,https,ftp
    2. host : 定义主机(http 默认主机是www)
    3. domain: 定义域名,比如 baidu.com
    4. :port : 定义主机上的端口号(http 默认的端口号是80)
    5. path : 定义服务器上的路径(如果省略/,则文档必须位于网站的根目录中)
    6. filename : 定义文档/资源的名称,比如 index.html
    7. queryName : 查询字符串,url 中携带的数据 如果username=admin

    2. querystring 模块

    querystring模块有一个parse方法和url.parse()加true非常相似,就是把query的字符串部分转为对象

    2.1 parse 方法使用方法

    parse方法是将字符串解析为对象

    querystring模块的parse方法接受四个参数

    语法

    ​ querystring.parse(str[,sep] [,eq] [,options])

    参数介绍

    1. str 参数是必须的, 就是制定被转换的查询字符串
    2. seq 可选, 指定分割字符 默认为'&' 一般不用
    3. eq 可选 指定查询字符串中的分配字符,默认 '=' 一般也不用
    4. 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])

    参数介绍

    1. obj 必须 用于指定被转换的对象
    2. sep 可选 表示指定查询字符串中所使用的分割字符串, 默认为 & 一般不用
    3. 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
    

    相关文章

      网友评论

          本文标题:第七节: 内置模块(三): url模块与path模块

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