javascript - 解析url中的特殊字符
问题描述
我有下一个网址:
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
如果我从密码中删除特殊符号 (% #),一切正常。
解决方案
问题很可能是密码中的#。如果您查看 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,则 url 变为
'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' }