Czy mogę użyć require ("ścieżka").Dołącz, aby bezpiecznie łączyć adresy URL?

Czy jest to bezpieczne w użyciu require("path").join do łączenia adresów URL, na przykład:

require("path").join("http://example.com", "ok"); 
//returns 'http://example.com/ok'

require("path").join("http://example.com/", "ok"); 
//returns 'http://example.com/ok'

Jeśli nie, jaki sposób sugerujesz, aby zrobić to bez pisania kodu pełnego if.

Author: Renato Gama, 2013-04-30

8 answers

Nie. path.join() zwróci nieprawidłowe wartości w przypadku użycia z adresami URL.

Brzmi jakbyś chciał. Z node docs :
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'

Edit: Jak słusznie zauważył Andreas w komentarzu, url.resolve pomoże tylko wtedy, gdy problem jest tak prosty, jak w przykładzie. url.parse odnosi się również do tego pytania, ponieważ zwraca konsekwentnie i przewidywalnie sformatowane pola za pośrednictwem obiektu URL, który zmniejsza potrzebę "kodu pełnego ifs".

 87
Author: Matthew Bakaitis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-06 23:51:47

Nie, Nie należy używać path.join() do łączenia elementów URL.

Jest za to paczka. Więc zamiast wymyślać na nowo koło, pisz wszystkie własne testy, znajdź błędy, napraw je, napisz więcej testów, znajdź przypadek krawędzi, gdzie to nie działa, itp., przydałoby ci się to paczka.

URL-join

Https://github.com/jfromaniello/url-join

Install

npm install url-join

Użycie

var urljoin = require('url-join');

var fullUrl = urljoin('http://www.google.com', 'a', '/b/cd', '?foo=123');

console.log(fullUrl);

Druki:

'http://www.google.com/a/b/cd?foo=123 "

 27
Author: stone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-06 23:52:36

Nie! W systemie Windows path.join połączy się z odwrotnymi ukośnikami. Adresy URL HTTP są zawsze ukośnikami do przodu.

A może

> ["posts", "2013"].join("/")
'posts/2013'
 6
Author: Colonel Panic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-30 13:50:55

Kiedy próbowałem ścieżki do łączenia części url napotkałem problemy. PATH.join paski '/ / 'w dół do' / ' i w ten sposób unieważnia bezwzględny adres url (np. http://... - >http:/...). Dla mnie szybkie rozwiązanie było:

baseurl.replace(/\/$/,"") + '/' + path.replace(/^\//,"") )

Lub z rozwiązaniem zamieszczonym przez pułkownika Panic:

[pathA.replace(/^\/|\/$/g,""),pathB.replace(/^\/|\/$/g,"")].join("/")
 5
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-27 12:03:19

Tego używam:

function joinUrlElements() {
  var re1 = new RegExp('^\\/|\\/$','g'),
      elts = Array.prototype.slice.call(arguments);
  return elts.map(function(element){return element.replace(re1,""); }).join('/');
}

Przykład:

url = joinUrlElements(config.mgmtServer, '/v1/o/', config.org, '/apps');
 3
Author: Cheeso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-18 20:06:05

Robimy to tak:

var _ = require('lodash');

function urlJoin(a, b) {
  return _.trimEnd(a, '/') + '/' + _.trimStart(b, '/');
}
 3
Author: Peter Dotchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-08 14:49:31

Jeśli używasz lodash , możesz użyć tego prostego onelinera:

// returns part1/part2/part3
['part1/', '/part2', '/part3/'].map((s) => _.trim(s, '/')).join('/')

Inspired by @ Peter Dotchev ' S answer

 2
Author: M K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-08 07:17:25

Axios posiada funkcję pomocniczą, która może łączyć adresy URL.

function combineURLs(baseURL, relativeURL) {
  return relativeURL
    ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
    : baseURL;
}

Źródło: https://github.com/axios/axios/blob/fe7d09bb08fa1c0e414956b7fc760c80459b0a43/lib/helpers/combineURLs.js

 1
Author: Ikbel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-22 13:59:43