分析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元素返回空

如果您对用户名和密码进行url编码所以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' }

最新更新