首页 > 解决方案 > 解析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

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

标签: javascriptnode.js

解决方案


问题很可能是密码中的#。如果您查看 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' }

推荐阅读