【问题标题】:Parse special characters in url解析url中的特殊字符
【发布时间】:2021-07-16 12:01:52
【问题描述】:

我有下一个网址:

postgres://someuser:pas#%w#@rd-some-db.cgosdsd8op.us-east-1.rds.amazonaws.com:5432

我正在通过下一个方式解析它:

const url = require('url');
const { hostname: host, port, auth, path } = url.parse(bdUrl);
    
const [user, password] = auth.split(':');

失败并出现下一个错误:

  const [user, password] = auth.split(':');
                                ^
TypeError: Cannot read property 'split' of null

如果我从密码中删除特殊符号 (% #),一切正常。

【问题讨论】:

  • postgres://someuser:pas#%w#@rd-some-db.cgosdsd8op.us-east-1.rds.amazonaws.com:5432 不是有效的 URL - 您需要 encodeURIComponent("pas#%w#@rd")
  • 这能回答你的问题吗? Encode URL in JavaScript?
  • 不,网址是硬编码的,没有特殊字符就可以完美运行。我也可以单独提取密码

标签: javascript node.js


【解决方案1】:

问题很可能是密码中的#。如果您查看 url 的定义 (例如见https://en.wikipedia.org/wiki/URL

URI = scheme:[//authority]path[?query][#fragment]
authority = [userinfo@]host[:port]

如果您查看 url 解析器如何解释该 url

使用如下代码:

const url = require('url');
const parsed = url.parse('postgres://someuser:pas#%w#@rd-some-db.cgosdsd8op.us-east-1.rds.amazonaws.com:5432');
console.log(parsed);

你会得到如下输出:

Url {
  protocol: 'postgres:',
  slashes: true,
  auth: null,
  host: 'someuser',
  port: null,
  hostname: 'someuser',
  hash: '#%w#@rd-some-db.cgosdsd8op.us-east-1.rds.amazonaws.com:5432',
  search: null,
  query: null,
  pathname: '/:pas',
  path: '/:pas',
  href: 'postgres://someuser/:pas#%w#@rd-some-db.cgosdsd8op.us-east-1.rds.amazonaws.com:5432' }

你得到的错误是因为 auth 元素返回 null

如果您对用户名和密码进行 urlencode 所以网址变成了

'postgres://someuser%3Apas%23%25w%23@some-db.cgosdsd8op.us-east-1.rds.amazonaws.com:5432'

你可以看到输出被正确解析了

Url {
  protocol: 'postgres:',
  slashes: true,
  auth: 'someuser:pas#%w#',
  host: 'some-db.cgosdsd8op.us-east-1.rds.amazonaws.com:5432',
  port: '5432',
  hostname: 'some-db.cgosdsd8op.us-east-1.rds.amazonaws.com',
  hash: null,
  search: null,
  query: null,
  pathname: null,
  path: null,
  href: 'postgres://someuser:pas%23%25w%23@some-db.cgosdsd8op.us-east-1.rds.amazonaws.com:5432' }

【讨论】:

  • 但是我输入的是整个 url,之前我无法对用户名和密码进行编码
  • 您可以使用正则表达式提取用户名和密码,例如url.match(/\/\/([^@]+)@/)
猜你喜欢
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
相关资源
最近更新 更多