【问题标题】:Fetch the value from url从 url 中获取值
【发布时间】:2014-01-14 01:19:32
【问题描述】:

我必须从以下 url 中提取访问令牌值。

http://localhost:4001/app1/#access_token=FH2yCAcgmPjMOtKcp3DE&refresh_token=pjgTyaj

如何在 node.js 中使用 connect 获取完整的 url 并获取 access_token 值? 我尝试使用req.urlreq.query 来获取完整的网址。

【问题讨论】:

  • @vittore 我已经检查了上面与获取查询参数相关的链接。但我的问题是获取“#access_token”
  • 以这种方式传递 access_token 似乎很奇怪。是否有不能作为标准 URL 参数传递的原因?

标签: node.js url


【解决方案1】:

更新:

http 客户端在查询 页面的服务器,因此服务器永远无法访问它,那就是 仅适用于浏览器。


当代理(浏览器)从服务器请求资源时,代理将唯一的 URI 发送到服务器(而不是片段)。相反,代理等待服务器发送响应,然后代理根据文档类型和片段值处理资源。 [[来源][1] & 更多信息这里是 [链接][2]]

因此,如果您在片段中有任何数据,则由您来处理该数据 (AJAX)


您可以考虑在客户端 JavaScript (`window.location.hash`) 获取哈希并将其发送到服务。 如果你得到这样的字符串,这里有一个例子:
var req_url = 'http://localhost:4001/app1/#access_token=FH2yCAcgmPjMOtKcp3DE&refresh_token=pjgTyaj';
HashKeyValueParsed_JSON = {};
require('url').parse(req_url).hash.substring(1).split('&').forEach(function (x) {
    var arr = x.split('=');
    arr[1] && (HashKeyValueParsed_JSON[arr[0]] = arr[1]);
});
console.log(HashKeyValueParsed_JSON); //Output JSON: { access_token: 'FH2yCAcgmPjMOtKcp3DE',  refresh_token: 'pjgTyaj' }

你会得到输出:

{ access_token: 'FH2yCAcgmPjMOtKcp3DE',
  refresh_token: 'pjgTyaj' }

我建议您不要将所有要求或任何功能放在循环之外,因为它是 Node.js 中的阻塞调用(即使它使用缓存[这里是源代码 link])。 有关更多信息,您可以阅读此answer

【讨论】:

  • req.url 给出输出 /app1/。如何获取完整的网址?
  • 是的,我忽略了那部分。我的坏..相应地更新了我的答案。
【解决方案2】:

根据nodejs url with hash,网址的哈希部分不会发送到服务器。您应该尝试通过查询发送access_token

【讨论】:

    【解决方案3】:

    网址中以# 开头的部分称为fragment identifier,或哈希。解析 url 将产生哈希。

    如果req.url 返回'http://localhost:4001/app1/#access_token=FH2yCAcgmPjMOtKcp3DE&refresh_token=pjgTyaj',则require('url').parse(req.url) 返回

    { protocol: 'http:',
      slashes: true,
      auth: null,
      host: 'localhost:4001',
      port: '4001',
      hostname: 'localhost',
      hash: '#access_token=FH2yCAcgmPjMOtKcp3DE&refresh_token=pjgTyaj',
      search: null,
      query: null,
      pathname: '/app1/',
      path: '/app1/',
      href: 'http://localhost:4001/app1/#access_token=FH2yCAcgmPjMOtKcp3DE&refresh_token=pjgTyaj' }
    

    因此,您要查找的部分位于已解析 url 的 hash 属性中: require('url').parse(req.url).hash

    【讨论】:

    • 我在这里做错了什么。哈希值为空。
      router.get('/app1', function (req, res, next) { var fullURL = require('url') .parse(req.url) console.log(fullURL) });
    • 你能发布更多你的代码吗?我可以创建自己的,但它可能完全不同。
    • router.get('/app1', function (req, res, next) { var req_url = require('url').parse(req.url) console.log(req_url); } );输出{协议:空,斜杠:空,身份验证:空,主机:空,端口:空,主机名:空,哈希:空,搜索:空,查询:空,路径名:'/app1/',路径:'/ app1/', href: '/app1/' }
    • 您是如何访问该 URL 的?通过浏览器,wget,...?输入的完整网址是什么?
    • 使用完整网址localhost:4001/app1/…通过浏览器访问
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2016-09-23
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多