URL
Исходный код: lib/url.js
Модуль node:url предоставляет утилиты для разрешения URL и их разбора. Его можно подключить следующим образом:
Модули JavaScript
import url from 'node:url';
CommonJS
const url = require('node:url');Строки URL и объекты URL
Строка URL — это структурированная строка, содержащая несколько значимых компонентов. При разборе возвращается объект URL со свойствами для каждого из этих компонентов.
Модуль node:url предоставляет два API для работы с URL: устаревший API, специфичный для Node.js, и более новый API, реализующий тот же стандарт URL WHATWG, который используется веб-браузерами.
Ниже приведено сравнение API WHATWG и устаревшего API. Над URL 'https://user:pass@sub.example.com:8080/p/a/t/h?query=string#hash' показаны свойства объекта, возвращаемого устаревшим url.parse(). Под ним показаны свойства объекта URL стандарта WHATWG.
Свойство origin URL WHATWG включает protocol и host, но не включает username или password.
┌────────────────────────────────────────────────────────────────────────────────────────────────┐ │ href │ ├──────────┬──┬─────────────────────┬────────────────────────┬───────────────────────────┬───────┤ │ protocol │ │ auth │ host │ path │ hash │ │ │ │ ├─────────────────┬──────┼──────────┬────────────────┤ │ │ │ │ │ hostname │ port │ pathname │ search │ │ │ │ │ │ │ │ ├─┬──────────────┤ │ │ │ │ │ │ │ │ │ query │ │ " https: // user : pass @ sub.example.com : 8080 /p/a/t/h ? query=string #hash " │ │ │ │ │ hostname │ port │ │ │ │ │ │ │ │ ├─────────────────┴──────┤ │ │ │ │ protocol │ │ username │ password │ host │ │ │ │ ├──────────┴──┼──────────┴──────────┼────────────────────────┤ │ │ │ │ origin │ │ origin │ pathname │ search │ hash │ ├─────────────┴─────────────────────┴────────────────────────┴──────────┴────────────────┴───────┤ │ href │ └────────────────────────────────────────────────────────────────────────────────────────────────┘ (All spaces in the "" line should be ignored. They are purely for formatting.) copy
Разбор строки URL с помощью API WHATWG:
const myURL =
new URL('https://user:pass@sub.example.com:8080/p/a/t/h?query=string#hash'); copy Разбор строки URL с помощью устаревшего API:
Модули JavaScript
import url from 'node:url';
const myURL =
url.parse('https://user:pass@sub.example.com:8080/p/a/t/h?query=string#hash');CommonJS
const url = require('node:url');
const myURL =
url.parse('https://user:pass@sub.example.com:8080/p/a/t/h?query=string#hash');Создание URL из его компонентов и получение созданной строки
URL WHATWG можно создать из отдельных компонентов с помощью сеттеров свойств или шаблонной строки:
const myURL = new URL('https://example.org');
myURL.pathname = '/a/b/c';
myURL.search = '?d=e';
myURL.hash = '#fgh'; copy const pathname = '/a/b/c';
const search = '?d=e';
const hash = '#fgh';
const myURL = new URL(`https://example.org${pathname}${search}${hash}`); copy Чтобы получить созданную строку URL, используйте геттер свойства href:
console.log(myURL.href); copy
API URL WHATWG
Класс: URL
Совместимый с браузерами класс URL, реализованный в соответствии со стандартом URL WHATWG. Примеры разобранных URL можно найти в самом стандарте. Класс URL также доступен в глобальном объекте.
В соответствии с соглашениями браузеров все свойства объектов URL реализованы как геттеры и сеттеры в прототипе класса, а не как свойства данных самого объекта. Поэтому, в отличие от устаревших объектов urlObject, использование ключевого слова delete для любых свойств объектов URL (например, delete myURL.protocol, delete myURL.pathname и т. д.) не оказывает эффекта, но при этом возвращает true.
new URL(input[, base])
-
input<string> Абсолютный или относительный входной URL для разбора. Еслиinputявляется относительным, требуетсяbase. Еслиinputявляется абсолютным,baseигнорируется. Еслиinputне является строкой, сначала оно преобразуется в строку. -
base<string> Базовый URL, относительно которого выполняется разрешение, еслиinputне является абсолютным. Еслиbaseне является строкой, сначала оно преобразуется в строку.
Создаёт новый объект URL, разбирая input относительно base. Если base передано в виде строки, оно будет разобрано так же, как new URL(base).
const myURL = new URL('/foo', 'https://example.org/');
// https://example.org/foo copy Конструктор URL доступен как свойство глобального объекта. Его также можно импортировать из встроенного модуля url:
Модули JavaScript
import { URL } from 'node:url';
console.log(URL === globalThis.URL); // Prints 'true'.CommonJS
console.log(URL === require('node:url').URL); // Prints 'true'.Будет выброшено исключение TypeError, если input или base не являются допустимыми URL. Обратите внимание, что значения будут попытаться привести к строкам. Например:
const myURL = new URL({ toString: () => 'https://example.org/' });
// https://example.org/ copy Символы Unicode в имени хоста input автоматически преобразуются в ASCII с помощью алгоритма Punycode.
const myURL = new URL('https://測試');
// https://xn--g6w251d/ copy Если заранее неизвестно, является ли input абсолютным URL, и указан base, рекомендуется проверить, что origin объекта URL имеет ожидаемое значение.
let myURL = new URL('http://Example.com/', 'https://example.org/');
// http://example.com/
myURL = new URL('https://Example.com/', 'https://example.org/');
// https://example.com/
myURL = new URL('foo://Example.com/', 'https://example.org/');
// foo://Example.com/
myURL = new URL('http:Example.com/', 'https://example.org/');
// http://example.com/
myURL = new URL('https:Example.com/', 'https://example.org/');
// https://example.org/Example.com/
myURL = new URL('foo:Example.com/', 'https://example.org/');
// foo:Example.com/ copy
url.hash
- Тип: <string>
Получает и задаёт фрагмент URL.
const myURL = new URL('https://example.org/foo#bar');
console.log(myURL.hash);
// Prints #bar
myURL.hash = 'baz';
console.log(myURL.href);
// Prints https://example.org/foo#baz copy Недопустимые символы URL, содержащиеся в значении, присвоенном свойству hash, кодируются в формате процентного кодирования. Выбор символов для процентного кодирования может несколько отличаться от того, который используется методами url.parse() и url.format().
url.host
- Тип: <string>
Получает и задаёт часть URL, содержащую хост.
const myURL = new URL('https://example.org:81/foo');
console.log(myURL.host);
// Prints example.org:81
myURL.host = 'example.com:82';
console.log(myURL.href);
// Prints https://example.com:82/foo copy Недопустимые значения хоста, присвоенные свойству host, игнорируются.
url.hostname
- Тип: <string>
Получает и задаёт часть URL, содержащую имя хоста. Ключевое различие между url.host и url.hostname состоит в том, что url.hostname не включает порт.
const myURL = new URL('https://example.org:81/foo');
console.log(myURL.hostname);
// Prints example.org
// Setting the hostname does not change the port
myURL.hostname = 'example.com';
console.log(myURL.href);
// Prints https://example.com:81/foo
// Use myURL.host to change the hostname and port
myURL.host = 'example.org:82';
console.log(myURL.href);
// Prints https://example.org:82/foo copy Недопустимые значения имени хоста, присвоенные свойству hostname, игнорируются.
url.href
- Тип: <string>
Получает и задаёт сериализованный URL.
const myURL = new URL('https://example.org/foo');
console.log(myURL.href);
// Prints https://example.org/foo
myURL.href = 'https://example.com/bar';
console.log(myURL.href);
// Prints https://example.com/bar copy Получение значения свойства href эквивалентно вызову url.toString().
Присвоение этому свойству нового значения эквивалентно созданию нового объекта URL с помощью new URL(value). Все свойства объекта URL будут изменены.
Если значение, присвоенное свойству href, не является допустимым URL, будет выброшено исключение TypeError.
url.origin
- Тип: <string>
Получает сериализованное происхождение URL только для чтения.
const myURL = new URL('https://example.org/foo/bar?baz');
console.log(myURL.origin);
// Prints https://example.org copy const idnURL = new URL('https://測試');
console.log(idnURL.origin);
// Prints https://xn--g6w251d
console.log(idnURL.hostname);
// Prints xn--g6w251d copy
url.password
- Тип: <string>
Получает и задаёт часть URL, содержащую пароль.
const myURL = new URL('https://abc:xyz@example.com');
console.log(myURL.password);
// Prints xyz
myURL.password = '123';
console.log(myURL.href);
// Prints https://abc:123@example.com/ copy Недопустимые символы URL, содержащиеся в значении, присвоенном свойству password, кодируются в формате процентного кодирования. Выбор символов для процентного кодирования может несколько отличаться от того, который используется методами url.parse() и url.format().
url.pathname
- Тип: <string>
Получает и задаёт путь URL.
const myURL = new URL('https://example.org/abc/xyz?123');
console.log(myURL.pathname);
// Prints /abc/xyz
myURL.pathname = '/abcdef';
console.log(myURL.href);
// Prints https://example.org/abcdef?123 copy Недопустимые символы URL, содержащиеся в значении, присвоенном свойству pathname, кодируются в формате процентного кодирования. Выбор символов для процентного кодирования может несколько отличаться от того, который используется методами url.parse() и url.format().
url.port
- Тип: <string>
Получает и задаёт часть URL, содержащую порт.
Значением порта может быть число или строка, содержащая число в диапазоне от 0 до 65535 включительно. Если задать значение порта по умолчанию для объектов URL с указанным protocol, значение port станет пустой строкой ('').
Значение порта может быть пустой строкой; в этом случае порт зависит от протокола/схемы:
| протокол | порт |
|---|---|
| "ftp" | 21 |
| "file" | |
| "http" | 80 |
| "https" | 443 |
| "ws" | 80 |
| "wss" | 443 |
При присвоении значения порту оно сначала будет преобразовано в строку с помощью .toString().
Если эта строка недопустима, но начинается с числа, это число в начале будет присвоено port. Если число выходит за указанный выше диапазон, оно игнорируется.
const myURL = new URL('https://example.org:8888');
console.log(myURL.port);
// Prints 8888
// Default ports are automatically transformed to the empty string
// (HTTPS protocol's default port is 443)
myURL.port = '443';
console.log(myURL.port);
// Prints the empty string
console.log(myURL.href);
// Prints https://example.org/
myURL.port = 1234;
console.log(myURL.port);
// Prints 1234
console.log(myURL.href);
// Prints https://example.org:1234/
// Completely invalid port strings are ignored
myURL.port = 'abcd';
console.log(myURL.port);
// Prints 1234
// Leading numbers are treated as a port number
myURL.port = '5678abcd';
console.log(myURL.port);
// Prints 5678
// Non-integers are truncated
myURL.port = 1234.5678;
console.log(myURL.port);
// Prints 1234
// Out-of-range numbers which are not represented in scientific notation
// will be ignored.
myURL.port = 1e10; // 10000000000, will be range-checked as described below
console.log(myURL.port);
// Prints 1234 copy Числа с десятичной точкой, например числа с плавающей точкой или числа в экспоненциальной записи, не являются исключением из этого правила. Начальные цифры до десятичной точки будут заданы в качестве порта URL, если они допустимы:
myURL.port = 4.567e21; console.log(myURL.port); // Prints 4 (because it is the leading number in the string '4.567e21') copy
url.protocol
- Тип: <string>
Получает и задаёт часть URL, содержащую протокол.
const myURL = new URL('https://example.org');
console.log(myURL.protocol);
// Prints https:
myURL.protocol = 'ftp';
console.log(myURL.href);
// Prints ftp://example.org/ copy Недопустимые значения протокола URL, присвоенные свойству protocol, игнорируются.
Специальные схемы
Стандарт URL WHATWG считает некоторые схемы протоколов URL специальными с точки зрения их разбора и сериализации. При разборе URL с использованием одного из этих специальных протоколов свойство url.protocol можно изменить на другой специальный протокол, но нельзя изменить на неспециальный протокол, и наоборот.
Например, изменение http на https работает:
const u = new URL('http://example.org');
u.protocol = 'https';
console.log(u.href);
// https://example.org/ copy Однако изменение http на гипотетический протокол fish не работает, поскольку новый протокол не является специальным.
const u = new URL('http://example.org');
u.protocol = 'fish';
console.log(u.href);
// http://example.org/ copy Аналогично, изменение неспециального протокола на специальный также не допускается:
const u = new URL('fish://example.org');
u.protocol = 'http';
console.log(u.href);
// fish://example.org copy Согласно стандарту URL WHATWG, специальными схемами протоколов являются ftp, file, http, https, ws и wss.
url.search
- Тип: <string>
Получает и задаёт сериализованную часть URL с параметрами запроса.
const myURL = new URL('https://example.org/abc?123');
console.log(myURL.search);
// Prints ?123
myURL.search = 'abc=xyz';
console.log(myURL.href);
// Prints https://example.org/abc?abc=xyz copy Любые недопустимые символы URL в значении, присвоенном свойству search, будут закодированы в формате процентного кодирования. Выбор символов для процентного кодирования может несколько отличаться от того, который используется методами url.parse() и url.format().
url.searchParams
- Тип: <URLSearchParams>
Получает объект URLSearchParams, представляющий параметры запроса URL. Это свойство доступно только для чтения, однако предоставляемый им объект URLSearchParams можно использовать для изменения экземпляра URL; чтобы заменить все параметры запроса URL, используйте сеттер url.search. Подробности см. в документации URLSearchParams.
Будьте осторожны при использовании .searchParams для изменения URL, поскольку, согласно спецификации WHATWG, объект URLSearchParams использует другие правила для определения символов, подлежащих процентному кодированию. Например, объект URL не кодирует символ ASCII-тильды (~), в то время как URLSearchParams всегда кодирует его:
const myURL = new URL('https://example.org/abc?foo=~bar');
console.log(myURL.search); // prints ?foo=~bar
// Modify the URL via searchParams...
myURL.searchParams.sort();
console.log(myURL.search); // prints ?foo=%7Ebar copy
url.username
- Тип: <string>
Получает и задаёт часть URL, содержащую имя пользователя.
const myURL = new URL('https://abc:xyz@example.com');
console.log(myURL.username);
// Prints abc
myURL.username = '123';
console.log(myURL.href);
// Prints https://123:xyz@example.com/ copy Любые недопустимые символы URL в значении, присвоенном свойству username, будут закодированы в формате процентного кодирования. Выбор символов для процентного кодирования может несколько отличаться от того, который используется методами url.parse() и url.format().
url.toString()
- Возвращает: <string>
Метод toString() объекта URL возвращает сериализованный URL. Возвращаемое значение эквивалентно значению url.href и url.toJSON().
url.toJSON()
- Возвращает: <string>
Метод toJSON() объекта URL возвращает сериализованный URL. Возвращаемое значение эквивалентно значению url.href и url.toString().
Этот метод вызывается автоматически при сериализации объекта URL с помощью JSON.stringify().
const myURLs = [
new URL('https://www.example.com'),
new URL('https://test.example.org'),
];
console.log(JSON.stringify(myURLs));
// Prints ["https://www.example.com/","https://test.example.org/"] copy
URL.createObjectURL(blob)
Создаёт строку URL 'blob:nodedata:...', представляющую заданный объект <Blob> и позволяющую получить Blob позднее.
const {
Blob,
resolveObjectURL,
} = require('node:buffer');
const blob = new Blob(['hello']);
const id = URL.createObjectURL(blob);
// later...
const otherBlob = resolveObjectURL(id);
console.log(otherBlob.size); copy Данные, хранящиеся в зарегистрированном <Blob>, будут оставаться в памяти до вызова URL.revokeObjectURL() для их удаления.
Объекты Blob регистрируются в текущем потоке. При использовании рабочих потоков объекты Blob, зарегистрированные в одном рабочем потоке, будут недоступны другим рабочим потокам и основному потоку.
URL.revokeObjectURL(id)
-
id<string> Строка URL'blob:nodedata:..., возвращённая предыдущим вызовомURL.createObjectURL().
Удаляет сохранённый <Blob>, указанный заданным идентификатором. Попытка отозвать незарегистрированный идентификатор завершается без ошибки.
URL.canParse(input[, base])
-
input<string> Абсолютный или относительный входной URL для разбора. Еслиinputявляется относительным, требуетсяbase. Еслиinputявляется абсолютным,baseигнорируется. Еслиinputне является строкой, сначала оно преобразуется в строку. -
base<string> Базовый URL, относительно которого выполняется разрешение, еслиinputне является абсолютным. Еслиbaseне является строкой, сначала оно преобразуется в строку. - Возвращает: <boolean>
Проверяет, можно ли разобрать input относительно base как URL.
const isValid = URL.canParse('/foo', 'https://example.org/'); // true
const isNotValid = URL.canParse('/foo'); // false copy
URL.parse(input[, base])
-
input<string> Абсолютный или относительный входной URL для разбора. Еслиinputявляется относительным, требуетсяbase. Еслиinputявляется абсолютным,baseигнорируется. Еслиinputне является строкой, сначала оно преобразуется в строку. -
base<string> Базовый URL, относительно которого выполняется разрешение, еслиinputне является абсолютным. Еслиbaseне является строкой, сначала оно преобразуется в строку. - Возвращает: <URL> | <null>
Разбирает строку как URL. Если задан base, он будет использоваться в качестве базового URL для разрешения неабсолютных URL input. Возвращает null, если параметры не удаётся преобразовать в допустимый URL.
Класс: URLPattern
API URLPattern предоставляет интерфейс для сопоставления URL или их частей с шаблоном.
const myPattern = new URLPattern('https://nodejs.org/docs/latest/api/*.html');
console.log(myPattern.exec('https://nodejs.org/docs/latest/api/dns.html'));
// Prints:
// {
// "hash": { "groups": { "0": "" }, "input": "" },
// "hostname": { "groups": {}, "input": "nodejs.org" },
// "inputs": [
// "https://nodejs.org/docs/latest/api/dns.html"
// ],
// "password": { "groups": { "0": "" }, "input": "" },
// "pathname": { "groups": { "0": "dns" }, "input": "/docs/latest/api/dns.html" },
// "port": { "groups": {}, "input": "" },
// "protocol": { "groups": {}, "input": "https" },
// "search": { "groups": { "0": "" }, "input": "" },
// "username": { "groups": { "0": "" }, "input": "" }
// }
console.log(myPattern.test('https://nodejs.org/docs/latest/api/dns.html'));
// Prints: true copy
new URLPattern()
Создаёт новый пустой объект URLPattern.
new URLPattern(string[, baseURL][, options])
-
string<string> Строка URL -
baseURL<string> | <undefined> Строка базового URL -
options<Object> Параметры
Разбирает string как URL и использует его для создания нового объекта URLPattern.
Если baseURL не указан, по умолчанию используется undefined.
Параметр может содержать логический атрибут ignoreCase, включающий сопоставление без учёта регистра, если ему присвоено значение true.
В случае ошибки разбора конструктор может выбросить исключение TypeError.
new URLPattern(obj[, baseURL][, options])
-
obj<Object> Входной шаблон -
baseURL<string> | <undefined> Строка базового URL -
options<Object> Параметры
Разбирает Object как входной шаблон и использует его для создания нового объекта URLPattern. Членами объекта могут быть любые из следующих значений: protocol, username, password, hostname, port, pathname, search, hash или baseURL.
Если baseURL не указан, по умолчанию используется undefined.
Параметр может содержать логический атрибут ignoreCase, включающий сопоставление без учёта регистра, если ему присвоено значение true.
В случае ошибки разбора конструктор может выбросить исключение TypeError.
urlPattern.exec(input[, baseURL])
-
input<string> | <Object> URL или его части -
baseURL<string> | <undefined> Строка базового URL
Входные данные могут быть строкой или объектом с отдельными частями URL. Членами объекта могут быть любые из следующих значений: protocol, username, password, hostname, port, pathname, search, hash или baseURL.
Если baseURL не указан, по умолчанию используется undefined.
Возвращает объект с ключом inputs, содержащим массив аргументов, переданных функции, а также ключи компонентов URL, содержащие соответствующие входные данные и совпавшие группы.
const myPattern = new URLPattern('https://nodejs.org/docs/latest/api/*.html');
console.log(myPattern.exec('https://nodejs.org/docs/latest/api/dns.html'));
// Prints:
// {
// "hash": { "groups": { "0": "" }, "input": "" },
// "hostname": { "groups": {}, "input": "nodejs.org" },
// "inputs": [
// "https://nodejs.org/docs/latest/api/dns.html"
// ],
// "password": { "groups": { "0": "" }, "input": "" },
// "pathname": { "groups": { "0": "dns" }, "input": "/docs/latest/api/dns.html" },
// "port": { "groups": {}, "input": "" },
// "protocol": { "groups": {}, "input": "https" },
// "search": { "groups": { "0": "" }, "input": "" },
// "username": { "groups": { "0": "" }, "input": "" }
// } copy
urlPattern.test(input[, baseURL])
-
input<string> | <Object> URL или его части -
baseURL<string> | <undefined> Строка базового URL
Входные данные могут быть строкой или объектом с отдельными частями URL. Членами объекта могут быть любые из следующих значений: protocol, username, password, hostname, port, pathname, search, hash или baseURL.
Если baseURL не указан, по умолчанию используется undefined.
Возвращает логическое значение, указывающее, соответствует ли входной параметр текущему шаблону.
const myPattern = new URLPattern('https://nodejs.org/docs/latest/api/*.html');
console.log(myPattern.test('https://nodejs.org/docs/latest/api/dns.html'));
// Prints: true copy Класс: URLSearchParams
API URLSearchParams предоставляет доступ для чтения и записи к строке запроса объекта URL. Класс URLSearchParams также можно использовать самостоятельно с одним из четырёх следующих конструкторов. Класс URLSearchParams также доступен в глобальном объекте.
Интерфейс WHATWG URLSearchParams и модуль querystring предназначены для схожих целей, однако назначение модуля querystring более общее, поскольку он позволяет настраивать символы-разделители (& и =). С другой стороны, этот API предназначен исключительно для строк запроса URL.
const myURL = new URL('https://example.org/?abc=123');
console.log(myURL.searchParams.get('abc'));
// Prints 123
myURL.searchParams.append('abc', 'xyz');
console.log(myURL.href);
// Prints https://example.org/?abc=123&abc=xyz
myURL.searchParams.delete('abc');
myURL.searchParams.set('a', 'b');
console.log(myURL.href);
// Prints https://example.org/?a=b
const newSearchParams = new URLSearchParams(myURL.searchParams);
// The above is equivalent to
// const newSearchParams = new URLSearchParams(myURL.search);
newSearchParams.append('a', 'c');
console.log(myURL.href);
// Prints https://example.org/?a=b
console.log(newSearchParams.toString());
// Prints a=b&a=c
// newSearchParams.toString() is implicitly called
myURL.search = newSearchParams;
console.log(myURL.href);
// Prints https://example.org/?a=b&a=c
newSearchParams.delete('a');
console.log(myURL.href);
// Prints https://example.org/?a=b&a=c copy
new URLSearchParams()
Создаёт новый пустой объект URLSearchParams.
new URLSearchParams(string)
-
string<string> Строка запроса
Разбирает string как строку запроса и использует её для создания нового объекта URLSearchParams. Начальный символ '?', если он есть, игнорируется.
let params;
params = new URLSearchParams('user=abc&query=xyz');
console.log(params.get('user'));
// Prints 'abc'
console.log(params.toString());
// Prints 'user=abc&query=xyz'
params = new URLSearchParams('?user=abc&query=xyz');
console.log(params.toString());
// Prints 'user=abc&query=xyz' copy
new URLSearchParams(obj)
-
obj<Object> Объект, представляющий набор пар «ключ-значение»
Создаёт новый объект URLSearchParams на основе хеш-таблицы параметров запроса. Ключ и значение каждого свойства obj всегда преобразуются в строки.
В отличие от модуля querystring, повторяющиеся ключи в виде значений-массивов не допускаются. Массивы преобразуются в строки с помощью array.toString(), которая просто объединяет все элементы массива запятыми.
const params = new URLSearchParams({
user: 'abc',
query: ['first', 'second'],
});
console.log(params.getAll('query'));
// Prints [ 'first,second' ]
console.log(params.toString());
// Prints 'user=abc&query=first%2Csecond' copy
new URLSearchParams(iterable)
-
iterable<Iterable> Итерируемый объект, элементы которого являются парами «ключ-значение»
Создаёт новый объект URLSearchParams на основе итерируемой карты способом, аналогичным конструктору <Map>. iterable может быть Array или любым итерируемым объектом. Это означает, что iterable может быть другим объектом URLSearchParams; в таком случае конструктор просто создаст копию переданного объекта URLSearchParams. Элементы iterable представляют собой пары «ключ-значение» и сами могут быть любыми итерируемыми объектами.
Повторяющиеся ключи допускаются.
let params;
// Using an array
params = new URLSearchParams([
['user', 'abc'],
['query', 'first'],
['query', 'second'],
]);
console.log(params.toString());
// Prints 'user=abc&query=first&query=second'
// Using a Map object
const map = new Map();
map.set('user', 'abc');
map.set('query', 'xyz');
params = new URLSearchParams(map);
console.log(params.toString());
// Prints 'user=abc&query=xyz'
// Using a generator function
function* getQueryPairs() {
yield ['user', 'abc'];
yield ['query', 'first'];
yield ['query', 'second'];
}
params = new URLSearchParams(getQueryPairs());
console.log(params.toString());
// Prints 'user=abc&query=first&query=second'
// Each key-value pair must have exactly two elements
new URLSearchParams([
['user', 'abc', 'error'],
]);
// Throws TypeError [ERR_INVALID_TUPLE]:
// Each query pair must be an iterable [name, value] tuple copy
urlSearchParams.append(name, value)
Добавляет новую пару «имя-значение» в строку запроса.
urlSearchParams.delete(name[, value])
Если указан value, удаляет все пары «имя-значение», в которых имя равно name, а значение равно value.
Если value не указан, удаляет все пары «имя-значение» с именем name.
urlSearchParams.entries()
- Возвращает: <Iterator>
Возвращает итератор ES6 Iterator по всем парам «имя-значение» в запросе. Каждый элемент итератора — это объект JavaScript Array. Первый элемент Array — это name, второй элемент Array — это value.
Псевдоним для urlSearchParams[Symbol.iterator]().
urlSearchParams.forEach(fn[, thisArg])
-
fn<Function> Вызывается для каждой пары «имя-значение» в запросе -
thisArg<Object> Используется как значениеthisпри вызовеfn
Перебирает каждую пару «имя-значение» в запросе и вызывает заданную функцию.
const myURL = new URL('https://example.org/?a=b&c=d');
myURL.searchParams.forEach((value, name, searchParams) => {
console.log(name, value, myURL.searchParams === searchParams);
});
// Prints:
// a b true
// c d true copy
urlSearchParams.get(name)
-
name<string> - Возвращает: <string> | <null> Строку или
null, если пары «имя-значение» с заданнымnameнет.
Возвращает значение первой пары «имя-значение», имя которой равно name. Если таких пар нет, возвращается null.
urlSearchParams.getAll(name)
-
name<string> - Возвращает: <string[]>
Возвращает значения всех пар «имя-значение», имя которых равно name. Если таких пар нет, возвращается пустой массив.
urlSearchParams.has(name[, value])
Проверяет, содержит ли объект URLSearchParams пары «ключ-значение» с учётом name и необязательного аргумента value.
Если указан value, возвращает true, когда существует пара «имя-значение» с теми же name и value.
Если value не указан, возвращает true, если существует хотя бы одна пара «имя-значение» с именем name.
urlSearchParams.keys()
- Возвращает: <Iterator>
Возвращает итератор ES6 Iterator по именам всех пар «имя-значение».
const params = new URLSearchParams('foo=bar&foo=baz');
for (const name of params.keys()) {
console.log(name);
}
// Prints:
// foo
// foo copy
urlSearchParams.set(name, value)
Устанавливает в объекте URLSearchParams значение value, связанное с name. Если уже существуют пары «имя-значение» с именем name, значение первой такой пары заменяется на value, а все остальные удаляются. Если таких пар нет, пара «имя-значение» добавляется в строку запроса.
const params = new URLSearchParams();
params.append('foo', 'bar');
params.append('foo', 'baz');
params.append('abc', 'def');
console.log(params.toString());
// Prints foo=bar&foo=baz&abc=def
params.set('foo', 'def');
params.set('xyz', 'opq');
console.log(params.toString());
// Prints foo=def&abc=def&xyz=opq copy
urlSearchParams.size
Общее количество записей параметров.
urlSearchParams.sort()
Сортирует все существующие пары «имя-значение» на месте по их именам. Сортировка выполняется с помощью устойчивого алгоритма сортировки, поэтому относительный порядок пар «имя-значение» с одинаковыми именами сохраняется.
Этот метод, в частности, можно использовать для увеличения количества попаданий в кэш.
const params = new URLSearchParams('query[]=abc&type=search&query[]=123');
params.sort();
console.log(params.toString());
// Prints query%5B%5D=abc&query%5B%5D=123&type=search copy
urlSearchParams.toString()
- Возвращает: <string>
Возвращает параметры поиска в виде строки, в которой при необходимости символы закодированы с помощью процентов.
urlSearchParams.values()
- Возвращает: <Iterator>
Возвращает итератор ES6 Iterator по значениям всех пар «имя-значение».
urlSearchParams[Symbol.iterator]()
- Возвращает: <Iterator>
Возвращает итератор ES6 Iterator по всем парам «имя-значение» в строке запроса. Каждый элемент итератора — это объект JavaScript Array. Первый элемент Array — это name, второй элемент Array — это value.
Псевдоним для urlSearchParams.entries().
const params = new URLSearchParams('foo=bar&xyz=baz');
for (const [name, value] of params) {
console.log(name, value);
}
// Prints:
// foo bar
// xyz baz copy
url.domainToASCII(domain)
Возвращает ASCII-представление domain в формате Punycode. Если domain — недопустимый домен, возвращается пустая строка.
Выполняет операцию, обратную url.domainToUnicode().
Модули JavaScript
import url from 'node:url';
console.log(url.domainToASCII('español.com'));
// Prints xn--espaol-zwa.com
console.log(url.domainToASCII('中文.com'));
// Prints xn--fiq228c.com
console.log(url.domainToASCII('xn--iñvalid.com'));
// Prints an empty stringCommonJS
const url = require('node:url');
console.log(url.domainToASCII('español.com'));
// Prints xn--espaol-zwa.com
console.log(url.domainToASCII('中文.com'));
// Prints xn--fiq228c.com
console.log(url.domainToASCII('xn--iñvalid.com'));
// Prints an empty string
url.domainToUnicode(domain)
Возвращает представление domain в кодировке Unicode. Если domain — недопустимый домен, возвращается пустая строка.
Выполняет операцию, обратную url.domainToASCII().
Модули JavaScript
import url from 'node:url';
console.log(url.domainToUnicode('xn--espaol-zwa.com'));
// Prints español.com
console.log(url.domainToUnicode('xn--fiq228c.com'));
// Prints 中文.com
console.log(url.domainToUnicode('xn--iñvalid.com'));
// Prints an empty stringCommonJS
const url = require('node:url');
console.log(url.domainToUnicode('xn--espaol-zwa.com'));
// Prints español.com
console.log(url.domainToUnicode('xn--fiq228c.com'));
// Prints 中文.com
console.log(url.domainToUnicode('xn--iñvalid.com'));
// Prints an empty string
url.fileURLToPath(url[, options])
-
url<URL> | <string> Строка URL файла или объект URL для преобразования в путь. -
options<Object>-
windows<boolean> | <undefined>true, еслиpathследует вернуть как путь к файлу Windows,false— для POSIX, аundefined— для системного значения по умолчанию. По умолчанию:undefined.
-
- Возвращает: <string> Полностью разрешённый путь к файлу Node.js, специфичный для платформы.
Эта функция обеспечивает правильное декодирование символов, закодированных с помощью процентов, а также корректную для разных платформ строку абсолютного пути.
Соображения безопасности:
Эта функция декодирует символы, закодированные с помощью процентов, включая закодированные сегменты-точки (%2e как . и %2e%2e как ..), а затем нормализует полученный путь. Это означает, что закодированные последовательности обхода каталогов (например, %2e%2e) декодируются и обрабатываются как фактический обход пути, хотя закодированные косые черты (%2F, %5C) корректно отклоняются.
Приложения не должны полагаться только на fileURLToPath() для предотвращения атак с обходом каталогов. Перед использованием возвращённого значения пути для операций с файловой системой всегда явно проверяйте путь и выполняйте проверки безопасности, чтобы убедиться, что он остаётся в ожидаемых границах.
Модули JavaScript
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
new URL('file:///C:/path/').pathname; // Incorrect: /C:/path/
fileURLToPath('file:///C:/path/'); // Correct: C:\path\ (Windows)
new URL('file://nas/foo.txt').pathname; // Incorrect: /foo.txt
fileURLToPath('file://nas/foo.txt'); // Correct: \\nas\foo.txt (Windows)
new URL('file:///你好.txt').pathname; // Incorrect: /%E4%BD%A0%E5%A5%BD.txt
fileURLToPath('file:///你好.txt'); // Correct: /你好.txt (POSIX)
new URL('file:///hello world').pathname; // Incorrect: /hello%20world
fileURLToPath('file:///hello world'); // Correct: /hello world (POSIX)CommonJS
const { fileURLToPath } = require('node:url');
new URL('file:///C:/path/').pathname; // Incorrect: /C:/path/
fileURLToPath('file:///C:/path/'); // Correct: C:\path\ (Windows)
new URL('file://nas/foo.txt').pathname; // Incorrect: /foo.txt
fileURLToPath('file://nas/foo.txt'); // Correct: \\nas\foo.txt (Windows)
new URL('file:///你好.txt').pathname; // Incorrect: /%E4%BD%A0%E5%A5%BD.txt
fileURLToPath('file:///你好.txt'); // Correct: /你好.txt (POSIX)
new URL('file:///hello world').pathname; // Incorrect: /hello%20world
fileURLToPath('file:///hello world'); // Correct: /hello world (POSIX)
url.fileURLToPathBuffer(url[, options])
-
url<URL> | <string> Строка URL файла или объект URL для преобразования в путь. -
options<Object>-
windows<boolean> | <undefined>true, еслиpathследует вернуть как путь к файлу Windows,false— для POSIX, аundefined— для системного значения по умолчанию. По умолчанию:undefined.
-
- Возвращает: <Buffer> Полностью разрешённый путь к файлу Node.js, специфичный для платформы, в виде <Buffer>.
Аналогична url.fileURLToPath(...), но вместо строкового представления пути возвращает Buffer. Это преобразование полезно, если входной URL содержит сегменты, закодированные с помощью процентов, которые не являются допустимыми последовательностями UTF-8 / Unicode.
Соображения безопасности:
Эта функция имеет те же особенности безопасности, что и url.fileURLToPath(). Она декодирует символы, закодированные с помощью процентов, включая закодированные сегменты-точки (%2e как . и %2e%2e как ..), и нормализует путь. Приложения не должны полагаться только на эту функцию для предотвращения атак с обходом каталогов. Перед использованием возвращённого значения Buffer для операций с файловой системой всегда явно проверяйте путь.
url.format(URL[, options])
-
URL<URL> Объект WHATWG URL -
options<Object>-
auth<boolean>true, если сериализованная строка URL должна включать имя пользователя и пароль, иfalseв противном случае. По умолчанию:true. -
fragment<boolean>true, если сериализованная строка URL должна включать фрагмент, иfalseв противном случае. По умолчанию:true. -
search<boolean>true, если сериализованная строка URL должна включать строку запроса, иfalseв противном случае. По умолчанию:true. -
unicode<boolean>true, если символы Unicode в компоненте узла строки URL следует кодировать напрямую, а не в формате Punycode. По умолчанию:false.
-
- Возвращает: <string>
Возвращает настраиваемое сериализованное представление URL String объекта WHATWG URL.
У объекта URL есть метод toString() и свойство href, возвращающие строковые представления URL. Однако настроить их каким-либо образом нельзя. Метод url.format(URL[, options]) позволяет базово настроить результат.
Модули JavaScript
import url from 'node:url';
const myURL = new URL('https://a:b@測試?abc#foo');
console.log(myURL.href);
// Prints https://a:b@xn--g6w251d/?abc#foo
console.log(myURL.toString());
// Prints https://a:b@xn--g6w251d/?abc#foo
console.log(url.format(myURL, { fragment: false, unicode: true, auth: false }));
// Prints 'https://測試/?abc'CommonJS
const url = require('node:url');
const myURL = new URL('https://a:b@測試?abc#foo');
console.log(myURL.href);
// Prints https://a:b@xn--g6w251d/?abc#foo
console.log(myURL.toString());
// Prints https://a:b@xn--g6w251d/?abc#foo
console.log(url.format(myURL, { fragment: false, unicode: true, auth: false }));
// Prints 'https://測試/?abc'
url.pathToFileURL(path[, options])
-
path<string> Путь для преобразования в URL файла. -
options<Object>-
windows<boolean> | <undefined>true, еслиpathследует рассматривать как путь к файлу Windows,false— для POSIX, аundefined— для системного значения по умолчанию. По умолчанию:undefined.
-
- Возвращает: <URL> Объект URL файла.
Эта функция обеспечивает абсолютное разрешение path и корректное кодирование управляющих символов URL при преобразовании в URL файла.
Модули JavaScript
import { pathToFileURL } from 'node:url';
new URL('/foo#1', 'file:'); // Incorrect: file:///foo#1
pathToFileURL('/foo#1'); // Correct: file:///foo%231 (POSIX)
new URL('/some/path%.c', 'file:'); // Incorrect: file:///some/path%.c
pathToFileURL('/some/path%.c'); // Correct: file:///some/path%25.c (POSIX)CommonJS
const { pathToFileURL } = require('node:url');
new URL(__filename); // Incorrect: throws (POSIX)
new URL(__filename); // Incorrect: C:\... (Windows)
pathToFileURL(__filename); // Correct: file:///... (POSIX)
pathToFileURL(__filename); // Correct: file:///C:/... (Windows)
new URL('/foo#1', 'file:'); // Incorrect: file:///foo#1
pathToFileURL('/foo#1'); // Correct: file:///foo%231 (POSIX)
new URL('/some/path%.c', 'file:'); // Incorrect: file:///some/path%.c
pathToFileURL('/some/path%.c'); // Correct: file:///some/path%25.c (POSIX)
url.urlToHttpOptions(url)
-
url<URL> Объект WHATWG URL для преобразования в объект параметров. - Возвращает: <Object> Объект параметров
-
protocol<string> Используемый протокол. -
hostname<string> Доменное имя или IP-адрес сервера, которому отправляется запрос. -
hash<string> Часть URL, содержащая фрагмент. -
search<string> Сериализованная часть URL, содержащая строку запроса. -
pathname<string> Часть URL, содержащая путь. -
path<string> Путь запроса. Если есть строка запроса, она должна быть включена. Например:'/index.html?page=12'. Если путь запроса содержит недопустимые символы, возникает исключение. В настоящее время отклоняются только пробелы, но в будущем это может измениться. -
href<string> Сериализованный URL. -
port<number> Порт удалённого сервера. -
auth<string> Базовая аутентификация, то есть'user:password'для формирования заголовка Authorization.
-
Эта служебная функция преобразует объект URL в обычный объект параметров, ожидаемый API http.request() и https.request().
Модули JavaScript
import { urlToHttpOptions } from 'node:url';
const myURL = new URL('https://a:b@測試?abc#foo');
console.log(urlToHttpOptions(myURL));
/*
{
protocol: 'https:',
hostname: 'xn--g6w251d',
hash: '#foo',
search: '?abc',
pathname: '/',
path: '/?abc',
href: 'https://a:b@xn--g6w251d/?abc#foo',
auth: 'a:b'
}
*/CommonJS
const { urlToHttpOptions } = require('node:url');
const myURL = new URL('https://a:b@測試?abc#foo');
console.log(urlToHttpOptions(myURL));
/*
{
protocol: 'https:',
hostname: 'xn--g6w251d',
hash: '#foo',
search: '?abc',
pathname: '/',
path: '/?abc',
href: 'https://a:b@xn--g6w251d/?abc#foo',
auth: 'a:b'
}
*/Устаревший API URL
Устаревший urlObject
Устаревший urlObject (require('node:url').Url или import { Url } from 'node:url') создаётся и возвращается функцией url.parse().
urlObject.auth
Свойство auth — это часть URL, содержащая имя пользователя и пароль, также называемая информацией пользователя. Эта подстрока следует за protocol и двойными косыми чертами (если они есть) и предшествует компоненту host, отделённому символом @. Эта строка содержит либо имя пользователя, либо имя пользователя и пароль, разделённые символом :.
Например: 'user:pass'.
urlObject.hash
Свойство hash — это часть URL, содержащая идентификатор фрагмента, включая начальный символ #.
Например: '#hash'.
urlObject.host
Свойство host — это полная часть URL с именем хоста в нижнем регистре, включая port, если он указан.
Например: 'sub.example.com:8080'.
urlObject.hostname
Свойство hostname — это часть компонента host с именем хоста в нижнем регистре, не содержащая port.
Например: 'sub.example.com'.
urlObject.href
Свойство href — это полная строка URL, которая была разобрана; компоненты protocol и host преобразованы в нижний регистр.
Например: 'http://user:pass@sub.example.com:8080/p/a/t/h?query=string#hash'.
urlObject.path
Свойство path представляет собой объединение компонентов pathname и search.
Например: '/p/a/t/h?query=string'.
Декодирование path не выполняется.
urlObject.pathname
Свойство pathname содержит весь раздел пути URL. Это всё, что следует за host (включая port) и предшествует началу компонентов query или hash, отделённых либо знаком вопроса ASCII (?), либо символом решётки (#).
Например: '/p/a/t/h'.
Декодирование строки пути не выполняется.
urlObject.port
Свойство port — это числовая часть порта компонента host.
Например: '8080'.
urlObject.protocol
Свойство protocol определяет схему протокола URL в нижнем регистре.
Например: 'http:'.
urlObject.query
Свойство query — это либо строка запроса без начального знака вопроса ASCII (?), либо объект, возвращённый методом parse() модуля querystring. Будет ли свойство query строкой или объектом, определяется аргументом parseQueryString, переданным в url.parse().
Например: 'query=string' или {'query': 'string'}.
Если возвращается строка, декодирование строки запроса не выполняется. Если возвращается объект, декодируются и ключи, и значения.
urlObject.search
Свойство search содержит всю часть URL, представляющую собой «строку запроса», включая начальный символ вопроса ASCII (?).
Например: '?query=string'.
Декодирование строки запроса не выполняется.
urlObject.slashes
Свойство slashes — это boolean со значением true, если после двоеточия в protocol должны следовать две косые черты ASCII (/).
url.format(urlObject)
-
urlObject<Object> Объект URL (возвращаемый функциейurl.parse()или созданный другим способом).
Метод url.format() возвращает отформатированную строку URL, полученную на основе urlObject.
const url = require('node:url');
url.format({
protocol: 'https',
hostname: 'example.com',
pathname: '/some/path',
query: {
page: 1,
format: 'json',
},
});
// => 'https://example.com/some/path?page=1&format=json' copy Если urlObject не является объектом или строкой, url.format() выбросит исключение TypeError.
Форматирование выполняется следующим образом:
- Создаётся новая пустая строка
result. - Если
urlObject.protocolявляется строкой, она добавляется вresultбез изменений. - В противном случае, если
urlObject.protocolне являетсяundefinedи не является строкой, выбрасываетсяError. - Для всех строковых значений
urlObject.protocol, которые не оканчиваются двоеточием ASCII (:), вresultдобавляется строка:. - Если истинно хотя бы одно из следующих условий, в
resultдобавляется строка//:-
Свойство
urlObject.slashesравно true; -
urlObject.protocolначинается сhttp,https,ftp,gopherилиfile;
-
Свойство
- Если значение свойства
urlObject.authявляется истинным иurlObject.hostилиurlObject.hostnameне равныundefined, значениеurlObject.authпреобразуется в строку и добавляется вresult, после чего добавляется строка@. - Если свойство
urlObject.hostравноundefined:- Если
urlObject.hostnameявляется строкой, она добавляется вresult. - В противном случае, если
urlObject.hostnameне являетсяundefinedи не является строкой, выбрасываетсяError. - Если значение свойства
urlObject.portявляется истинным иurlObject.hostnameне равноundefined:- В
resultдобавляется строка:, и - значение
urlObject.portпреобразуется в строку и добавляется вresult.
- В
- Если
- В противном случае, если значение свойства
urlObject.hostявляется истинным, значениеurlObject.hostпреобразуется в строку и добавляется вresult. - Если свойство
urlObject.pathnameявляется непустой строкой:- Если
urlObject.pathnameне начинается с косой черты ASCII (/), вresultдобавляется строка'/'. - Значение
urlObject.pathnameдобавляется вresult.
- Если
- В противном случае, если
urlObject.pathnameне являетсяundefinedи не является строкой, выбрасываетсяError. - Если свойство
urlObject.searchравноundefined, а свойствоurlObject.queryявляетсяObject, вresultдобавляется строка?, за которой следует результат вызова методаstringify()модуляquerystringс передачей значенияurlObject.query. - В противном случае, если
urlObject.searchявляется строкой:- Если значение
urlObject.searchне начинается со знака вопроса ASCII (?), вresultдобавляется строка?. - Значение
urlObject.searchдобавляется вresult.
- Если значение
- В противном случае, если
urlObject.searchне являетсяundefinedи не является строкой, выбрасываетсяError. - Если свойство
urlObject.hashявляется строкой:- Если значение
urlObject.hashне начинается с символа решётки ASCII (#), вresultдобавляется строка#. - Значение
urlObject.hashдобавляется вresult.
- Если значение
- В противном случае, если свойство
urlObject.hashне равноundefinedи не является строкой, выбрасываетсяError. -
Возвращается
result.
Доступна автоматическая миграция (исходный код).
npx codemod@latest @nodejs/node-url-to-whatwg-url copy
url.format(urlString)
-
urlString<string> Строка, которая будет передана вurl.parse(), а затем отформатирована.
url.format(urlString) — сокращённая форма записи для url.format(url.parse(urlString)).
Поскольку эта функция вызывает устаревшую функцию url.parse(), передача строкового аргумента в url.format() сама по себе считается устаревшей.
Канонизацию строки URL можно выполнить с помощью API URL WHATWG: создайте новый объект URL и вызовите url.toString().
Модули JavaScript
import { URL } from 'node:url';
const unformatted = 'http://[fe80:0:0:0:0:0:0:1]:/a/b?a=b#abc';
const formatted = new URL(unformatted).toString();
console.log(formatted); // Prints: http://[fe80::1]/a/b?a=b#abcCommonJS
const { URL } = require('node:url');
const unformatted = 'http://[fe80:0:0:0:0:0:0:1]:/a/b?a=b#abc';
const formatted = new URL(unformatted).toString();
console.log(formatted); // Prints: http://[fe80::1]/a/b?a=b#abc
url.parse(urlString[, parseQueryString[, slashesDenoteHost]])
-
urlString<string> Строка URL для разбора. -
parseQueryString<boolean> Еслиtrue, свойствуqueryвсегда будет присваиваться объект, возвращённый методомparse()модуляquerystring. Еслиfalse, свойствоqueryвозвращаемого объекта URL будет неразобранной и недекодированной строкой. По умолчанию:false. -
slashesDenoteHost<boolean> Еслиtrue, первый токен после строки//и перед следующим/будет интерпретироваться какhost. Например, для//foo/barрезультатом будет{host: 'foo', pathname: '/bar'}, а не{pathname: '//foo/bar'}. По умолчанию:false.
Метод url.parse() принимает строку URL, разбирает её и возвращает объект URL.
Если urlString не является строкой, выбрасывается TypeError.
Если свойство auth присутствует, но не может быть декодировано, выбрасывается URIError.
url.parse() использует снисходительный нестандартный алгоритм разбора строк URL. Он подвержен проблемам безопасности, таким как подмена имени хоста и некорректная обработка имён пользователей и паролей. Не используйте его с недоверенными данными. CVE не присваиваются уязвимостям url.parse(). Вместо этого используйте API URL WHATWG, например:
function getURL(req) {
const proto = req.headers['x-forwarded-proto'] || 'https';
const host = req.headers['x-forwarded-host'] || req.headers.host || 'example.com';
return new URL(`${proto}://${host}${req.url || '/'}`);
} copy Приведённый выше пример предполагает, что корректно сформированные заголовки передаются с обратного прокси-сервера на сервер Node.js. Если обратный прокси-сервер не используется, следует использовать пример ниже:
function getURL(req) {
return new URL(`https://example.com${req.url || '/'}`);
} copy Доступна автоматическая миграция (исходный код).
npx codemod@latest @nodejs/node-url-to-whatwg-url copy
url.resolve(from, to)
-
from<string> Базовый URL, используемый, еслиto— относительный URL. -
to<string> Целевой URL для разрешения.
Метод url.resolve() разрешает целевой URL относительно базового URL подобно тому, как веб-браузер разрешает URL в теге привязки.
const url = require('node:url');
url.resolve('/one/two/three', 'four'); // '/one/two/four'
url.resolve('http://example.com/', '/one'); // 'http://example.com/one'
url.resolve('http://example.com/one', '/two'); // 'http://example.com/two' copy Чтобы получить тот же результат с помощью API URL WHATWG:
function resolve(from, to) {
const resolvedUrl = new URL(to, new URL(from, 'resolve://'));
if (resolvedUrl.protocol === 'resolve:') {
// `from` is a relative URL.
const { pathname, search, hash } = resolvedUrl;
return pathname + search + hash;
}
return resolvedUrl.toString();
}
resolve('/one/two/three', 'four'); // '/one/two/four'
resolve('http://example.com/', '/one'); // 'http://example.com/one'
resolve('http://example.com/one', '/two'); // 'http://example.com/two' copy Процентное кодирование в URL
В URL разрешено использовать только определённый диапазон символов. Любой символ за пределами этого диапазона необходимо кодировать. Способ кодирования таких символов и выбор символов для кодирования полностью зависят от места символа в структуре URL.
Устаревший API
В устаревшем API пробелы (' ') и следующие символы автоматически экранируются в свойствах объектов URL:
< > " ` \r \n \t { } | \ ^ ' copy Например, символ пробела ASCII (' ') кодируется как %20. Косая черта ASCII (/) кодируется как %3C.
API WHATWG
Стандарт URL WHATWG использует более избирательный и точный подход к выбору символов для кодирования, чем устаревший API.
Алгоритм WHATWG определяет четыре «набора символов для процентного кодирования», описывающих диапазоны символов, которые необходимо кодировать с помощью процентов:
-
Набор C0 для процентного кодирования управляющих символов включает кодовые точки в диапазоне от U+0000 до U+001F (включительно), а также все кодовые точки выше U+007E (~).
-
Набор фрагмента для процентного кодирования включает набор C0 для процентного кодирования управляющих символов и кодовые точки U+0020 SPACE, U+0022 ("), U+003C (<), U+003E (>) и U+0060 (`).
-
Набор пути для процентного кодирования включает набор C0 для процентного кодирования управляющих символов и кодовые точки U+0020 SPACE, U+0022 ("), U+0023 (#), U+003C (<), U+003E (>), U+003F (?), U+0060 (`), U+007B ({) и U+007D (}).
-
Набор userinfo для кодирования включает набор пути для процентного кодирования и кодовые точки U+002F (/), U+003A (:), U+003B (;), U+003D (=), U+0040 (@), от U+005B ([) до U+005E(^), а также U+007C (|).
Набор userinfo для процентного кодирования используется исключительно для имён пользователей и паролей, закодированных в URL. Набор пути для процентного кодирования используется для путей большинства URL. Набор фрагмента для процентного кодирования используется для фрагментов URL. Набор C0 для процентного кодирования управляющих символов используется для хоста и пути при определённых условиях, а также во всех остальных случаях.
Если в имени хоста встречаются символы, отличные от ASCII, имя хоста кодируется с помощью алгоритма Punycode. Однако обратите внимание, что имя хоста может содержать одновременно символы, закодированные с помощью Punycode, и символы, закодированные с помощью процентов:
const myURL = new URL('https://%CF%80.example.com/foo');
console.log(myURL.href);
// Prints https://xn--1xa.example.com/foo
console.log(myURL.origin);
// Prints https://xn--1xa.example.com copy
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v24.x/docs/api/url.html