Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解析url中的特殊字符_Javascript_Node.js - Fatal编程技术网

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' }