Javascript 解析url中的特殊字符
我有下一个网址:Javascript 解析url中的特殊字符,javascript,node.js,Javascript,Node.js,我有下一个网址: 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(':'); 它
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的定义 (参见示例) 如果您查看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
如果您对用户名和密码进行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' }
postgres://someuser:pas#%w#@rd some db.cgosdd8op.us-east-1.rds.amazonaws.com:5432
不是有效的URL-您需要encodeURIComponent(“pas#%w#@rd”)
这是否回答了您的问题?不,url是硬编码的,没有特殊字符,它工作得很完美。此外,我可以单独提取密码,但我在输入时有完整的url,在您可以使用正则表达式提取用户名和密码之前,我无法对用户名和密码进行编码,例如url.match(/\/\/([^@]+)@/)
,这也可能对您有所帮助
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' }