Безопасно ли это использовать require("path").join
для объединения URL-адресов, например:
require("path").join("http://example.com", "ok");
//returns 'http://example.com/ok'
require("path").join("http://example.com/", "ok");
//returns 'http://example.com/ok'
Если нет, то какой способ сделать это без написания кода, полного «если»?
node.js
url
string-concatenation
Ренато Гама
источник
источник
path.posix.join('/one/two/three', 'four') // '/one/two/three/four
,path.posix.join('/one/two/three/', 'four') // '/one/two/three/four
,path.posix.join('/one/two/three/', '/four') // '/one/two/three/four
path.posix.join('http://localhost:9887/one/two/three/', '/four')
, объединение избавится от одной из двойных косыхhttp://
'http://localhost:9887/one/two/three/'.replace(/^\/+|\/+$/, '') + '/' + '/four'.replace(/^\/+|\/+$/, '')
и вы могли бы это сделать,String.prototype.trimSlashes = function() { return this.replace(/^\/+|\/+$/, ''); }
если не хотите вводить регулярное выражение снова и снова. stackoverflow.com/a/22387870/2537258['http://localhost:9887/one/two/three/', '/four'].map((part) => part. replace(/^\/+|\/+$/, '')).join('/')
Ответы:
Нет
path.join()
, вернет неверные значения при использовании с URL-адресами.Похоже, ты хочешь
url.resolve
. Из документов Node :Изменить: как правильно указывает Андреас в комментарии,
url.resolve
поможет только в том случае, если проблема так же проста, как пример.url.parse
также относится к этому вопросу, потому что он возвращает последовательно и предсказуемо отформатированные поля черезURL
объект, что снижает потребность в «коде, полном if».источник
url.resolve('/one/two/three/', 'four')
то вывод был бы'one/two/three/four'
.path.posix.join('/one/two/three', 'four') // '/one/two/three/four
,path.posix.join('/one/two/three/', 'four') // '/one/two/three/four
,path.posix.join('/one/two/three/', '/four') // '/one/two/three/four
url.resolve('/one/two/three', 'four') // '/one/two/four'
в ответ правильныйurl.resolve()
виду, что принимает только 2 аргумента, где aspath.join()
принимает любое число. Так что, в зависимости от того, что вы делаете, вам может потребоватьсяurl.resolve(url.resolve(SERVER_URL, pagePath), queryString)
Нет, вы не должны использовать
path.join()
для присоединения элементов URL.Для этого есть пакет. Поэтому вместо того, чтобы изобретать велосипед, писать все свои собственные тесты, находить ошибки, исправлять их, писать больше тестов, находить крайний случай, когда это не работает, и т. Д., Вы можете использовать этот пакет.
URL присоединиться
https://github.com/jfromaniello/url-join
устанавливать
npm install url-join
использование
Печать:
' http://www.google.com/a/b/cd?foo=123 '
источник
Axios имеет вспомогательную функцию, которая может комбинировать URL-адреса.
источник
Когда я попробовал PATH для объединения частей URL, я столкнулся с проблемами.
PATH.join
полосы '//' вниз до '/', и таким образом аннулируется абсолютный URL (например, http: // ... -> http: / ...). Для меня быстрое исправление было:или с решением, опубликованным полковником Паником:
источник
/assets/foo
:? Это приведет к URL-адресу, относящемуся к текущему путиassets/foo
.Нет! В Windows
path.join
будет соединяться с обратной косой чертой. URL-адреса HTTP всегда представляют собой косую черту.Как насчет
источник
["posts/", "2013"].join("/")
?posts//2013
по-прежнему является действующим URL.path.posix.join('/one/two/three', 'four') // '/one/two/three/four
,path.posix.join('/one/two/three/', 'four') // '/one/two/three/four
,path.posix.join('/one/two/three/', '/four') // '/one/two/three/four
Делаем это так:
источник
Если вы используете lodash , вы можете использовать этот простой лайнер:
вдохновленный @Peter Dotchev в ответ
источник
Если вы используете Angular, вы можете использовать Location :
Однако работает только с двумя аргументами, поэтому вам нужно связать вызовы или написать вспомогательную функцию, чтобы сделать это, если это необходимо.
источник
Объект WHATWG URL - конструктор имеет
(input, base)
версию, иinput
может быть относительным использованием/
,./
,../
. Совместите это с,path.posix.join
и вы можете сделать что угодно:источник
Вот что я использую:
пример:
источник
/assets/foo
:? Это приведет к URL-адресу, относящемуся к текущему путиassets/foo
.Этого можно добиться с помощью комбинации пути и URL-адреса узла :
pathname=
иpath.join
для построения любой возможной комбинации:(вы можете видеть, насколько либеральны
path.join
аргументы)Почему такой подход?
В этом методе используются встроенные библиотеки. Чем меньше сторонних зависимостей, тем лучше, когда дело касается CVE, обслуживания и т. Д.
PS: Никогда не манипулируйте URL-адресами как строками!
Когда я просматриваю код, я категорически против никогда не манипулировать URL-адресами как строками вручную . Во-первых, посмотрите, насколько сложна спецификация .
Во-вторых, отсутствие / наличие завершающей / префиксной косой черты (
/
) не должно приводить к поломке всего! Никогда не делайте:и особенно нет:
С которыми я только что столкнулся в кодовой базе.
источник
Индивидуальное решение Typescript:
источник
Мое решение
Изменить: если вы хотите поддерживать среды Windows
Второе решение заменит все обратные косые черты, поэтому части URL, такие как строка запроса и хэш, также могут быть изменены, но тема присоединяется только к пути URL, поэтому я не считаю это проблемой.
источник
Есть и другие рабочие ответы, но я выбрал следующее. Небольшая комбинация path.join / URL.
источник