【问题标题】:Get query strings as an object after a url with hash在带有哈希的 url 之后获取查询字符串作为对象
【发布时间】:2019-07-02 07:36:51
【问题描述】:

所以我有一个这种格式的网址。 :

https://my-app.com/my-route/someOtherRoute#register?param1="122"&param2="333"

我知道如何获取普通 url 的查询字符串,但我无法获取 # 之后的查询字符串

我使用node-url,到目前为止我做到了:

import * as urlTool from 'url';
const url = "https://my-app.com/my-route/someOtherRoute#register?param1="122"&param2="333"
const parsedUrl = urlTool.parse(url,true);
const { pathName, hash } = parsedUrl

所以到目前为止,我的hash 有这个值#register?param1="122"&param2="333" 但是我怎样才能以动态方式获取查询字符串,因为查询字符串可能会或可能不会一直存在,而我没有也知道它们的名称,我怎样才能得到任何可能出现在 url 中 # 之后的查询字符串?

【问题讨论】:

  • 你不能在? 上拆分并使用URLSearchParams 吗? URL 中对? 的任何引用都表示查询参数,因此您不必担心 URL 的结构。

标签: javascript node.js typescript url url-routing


【解决方案1】:

您可以使用splitObject.fromEntriesURLSearchParams 将查询参数提取到对象中:

const url = `https://my-app.com/my-route/someOtherRoute#register?param1="122"&param2="333"`

const [hash, query] = url.split('#')[1].split('?')
const params = Object.fromEntries(new URLSearchParams(query))

console.log(hash)
console.log(params)

【讨论】:

    【解决方案2】:

    使用SearchParams

    var url = `https://my-app.com/my-route/someOtherRoute#register?param1="122"&param2="333"`;
    console.log(new URL(`https://1.com?${url.split("?")[1]}`).searchParams.get("param1"));

    使用String#splitArray#reduce 构建对象

    var url = `https://my-app.com/my-route/someOtherRoute#register?param1="122"&param2="333"`;
    console.log(url.split("?")[1].split("&").reduce(function(result, param) {
      var [key, value] = param.split("=");
      result[key] = value;
      return result;
    }, {}));

    认为这样写会更安全:

    function getParamsAfterHash(url) {
      if (typeof url !== "string" || !url) url = location.href;
      url = url.split("#")[1];
      if (!url) return {};
      url = url.split("?")[1];
      if (!url) return {};
      return url.split("&").reduce(function(result, param) {
        var [key, value] = param.split("=");
        result[key] = value;
        return result;
      }, {});
    }
    
    console.log(getParamsAfterHash(`https://my-app.com/my-route/someOtherRoute#register?param1="122"&param2="333"`));

    【讨论】:

    • 很好,我不知道您可以直接从 URL 对象获取 URLSearchParams 对象。
    猜你喜欢
    • 1970-01-01
    • 2020-05-15
    • 2016-09-25
    • 2011-06-05
    • 2015-06-14
    • 1970-01-01
    • 2013-08-28
    • 2012-05-12
    相关资源
    最近更新 更多