【问题标题】:node legacy url.parse deprecated, what to use instead?node legacy url.parse 已弃用,改用什么?
【发布时间】:2020-04-10 00:02:54
【问题描述】:

require('url').parse('someurl.com/page') 已被仅用于文档的弃用,我们严格的 linter 对此感到不满...我已尝试在我们的代码中用互联网建议的 new URL('someurl.com/page') 替换它,这在大多数情况下都有效。

但是,我们有一些示例,其中 url 是本地图像 some/image.png,并且可以很好地与 url.parse() 配合使用并返回:

Url {
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: null,
  query: null,
  pathname: '/some/image.png',
  path: '/some/image.png',
  href: '/some/image.png'
}

但是建议的替换 new URL('some/image.png') 会引发类型错误...

TypeError [ERR_INVALID_URL] [ERR_INVALID_URL]:无效的 URL: /some/image.png

url.parse 正在做一些验证并接受本地路径,但新的 url 构造函数没有。怎么办?

【问题讨论】:

    标签: javascript node.js url


    【解决方案1】:
    const server = http.createServer((req, res) => {
       const baseURL =  req.protocol + '://' + req.headers.host + '/';
       const reqUrl = new URL(req.url,baseURL);
       console.log(reqUrl);
    });
    

    会给reqUrl:

    URL {
      href: 'http://127.0.0.1:3000/favicon.ico',
      origin: 'http://127.0.0.1:3000',
      protocol: 'http:',
      username: '',
      password: '',
      host: '127.0.0.1:3000',
      hostname: '127.0.0.1',
      port: '3000',
      pathname: '/favicon.ico',
      search: '',
      searchParams: URLSearchParams {},
      hash: ''
    }
    

    【讨论】:

    • baseURL = req.protocol + '://' + req.headers.host + '/'; 可能更正确,因为请求实际上可能是https
    • req.protocol 未定义
    【解决方案2】:

    您可以使用 URL 构造函数的基本参数。例如:

    new URL('some/image-png', "https://dummyurl.com")
    

    欲了解更多信息,https://nodejs.org/api/url.html#url_constructor_new_url_input_base

    【讨论】:

    【解决方案3】:
    const path = require("path");
    const url = require("url");
    
    const p = path.join("public", "images", "a.jpg");
    
    console.log(p);                                     // public\images\a.jpg
    console.log(new url.URL(p, "http://xxx").pathname); // /public/images/a.jpg
    

    【讨论】:

      【解决方案4】:

      这是在不使用任何外部模块的情况下获取查询字符串参数的方法

      const http = require("http");
      
      const server = http.createServer((req, res) => {
        const url = new URL(req.url, `http://${req.headers.host}/`);
      
        const query = new URLSearchParams(url.search);
        console.log(query.entries());
      
        res.end("I am done");
      });
      
      server.listen(3000);
      

      【讨论】:

        猜你喜欢
        • 2016-02-17
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多