Czy jest to bezpieczne do require("path").join
łą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, w jaki sposób możesz to zrobić bez pisania pełnego kodu ifs?
node.js
url
string-concatenation
Renato Gama
źródło
źródło
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')
, złączenie pozbywa się jednego z podwójnych cięć whttp://
'http://localhost:9887/one/two/three/'.replace(/^\/+|\/+$/, '') + '/' + '/four'.replace(/^\/+|\/+$/, '')
i możesz to zrobić,String.prototype.trimSlashes = function() { return this.replace(/^\/+|\/+$/, ''); }
jeśli nie chcesz w kółko wpisywać wyrażenia regularnego. stackoverflow.com/a/22387870/2537258['http://localhost:9887/one/two/three/', '/four'].map((part) => part. replace(/^\/+|\/+$/, '')).join('/')
Odpowiedzi:
Nie
path.join()
zwróci nieprawidłowe wartości w przypadku użycia z adresami URL.Brzmi tak, jak chcesz
url.resolve
. Z dokumentacji Node :Edycja: Jak słusznie wskazuje Andreas w komentarzu,
url.resolve
pomogłoby to tylko wtedy, gdy problem jest tak prosty, jak na przykładzie.url.parse
dotyczy również tego pytania, ponieważ zwraca ono spójnie i przewidywalnie sformatowane pola za pośrednictwemURL
obiektu, co zmniejsza potrzebę stosowania „kodu pełnego if”.źródło
url.resolve('/one/two/three/', 'four')
wynik byłby'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'
w odpowiedzi jest poprawnaurl.resolve()
że przyjmuje tylko 2 argumenty, gdzie aspath.join()
przyjmuje dowolną liczbę. W zależności od tego, co robisz, może być konieczne zagnieżdżanie połączeń, np. ...url.resolve(url.resolve(SERVER_URL, pagePath), queryString)
Nie, nie powinieneś używać
path.join()
do łączenia elementów URL.Jest pakiet do tego teraz. Więc zamiast wymyślać koło na nowo, pisz własne testy, znajduj błędy, naprawiaj je, pisz więcej testów, znajdź skrajny przypadek, w którym to nie działa itp., Możesz użyć tego pakietu.
dołączenie url
https://github.com/jfromaniello/url-join
zainstalować
npm install url-join
Stosowanie
Wydruki:
„ http://www.google.com/a/b/cd?foo=123 ”
źródło
Axios ma funkcję pomocniczą, która może łączyć adresy URL.
źródło
Kiedy próbowałem PATH do łączenia części adresów URL, napotykam problemy.
PATH.join
stripes '//' aż do '/' iw ten sposób unieważnia bezwzględny adres URL (np. http: // ... -> http: / ...). Dla mnie szybkim rozwiązaniem było:lub z rozwiązaniem opublikowanym przez Colonel Panic:
źródło
/assets/foo
? Spowoduje to powstanie adresu URL względem bieżącej ścieżkiassets/foo
.Nie! W systemie Windows
path.join
dołączy z ukośnikiem odwrotnym. Adresy URL HTTP są zawsze ukośnikami.Co powiesz na
źródło
["posts/", "2013"].join("/")
?posts//2013
nadal jest prawidłowym adresem 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
Robimy to tak:
źródło
Jeśli używasz lodash , możesz użyć tego prostego onelinera:
zainspirowany @Peter Dotchev za odpowiedź
źródło
Jeśli używasz Angular, możesz użyć lokalizacji :
Działa jednak tylko na 2 argumentach, więc w razie potrzeby musisz łączyć wywołania lub napisać funkcję pomocniczą, aby to zrobić.
źródło
Oto czego używam:
przykład:
źródło
/assets/foo
? Spowoduje to powstanie adresu URL względem bieżącej ścieżkiassets/foo
.Obiekt WHATWG URL konstruktor ma
(input, base)
wersję, ainput
może być względna użyciu/
,./
,../
. Połącz to zpath.posix.join
i możesz zrobić wszystko:źródło
Niestandardowe rozwiązanie dla maszynopisu:
źródło
Moje rozwiązanie
Edycja: jeśli chcesz obsługiwać środowiska Windows
Drugie rozwiązanie zastąpi wszystkie odwrotne ukośniki, więc części adresu URL, takie jak querystring i hash, mogą również zostać zmienione, ale temat łączy się tylko ze ścieżką adresu URL, więc nie uważam tego za problem.
źródło
Istnieją inne działające odpowiedzi, ale poszedłem z następującymi. Mała kombinacja path.join / URL.
źródło
Można to osiągnąć za pomocą kombinacji ścieżki i adresu URL węzła :
pathname=
ipath.join
do skonstruowania dowolnej możliwej kombinacji:(możesz zobaczyć, jak liberalny
path.join
jest z argumentami)Dlaczego takie podejście?
Ta technika wykorzystuje wbudowane biblioteki. Im mniej zależności zewnętrznych, tym lepiej, jeśli chodzi o CVE, konserwację itp.
PS: Nigdy nie manipuluj adresami URL jako ciągami!
Kiedy przeglądam kod, zdecydowanie nie chcę ręcznie manipulować adresami URL jako ciągami . Po pierwsze, spójrz, jak skomplikowana jest specyfikacja .
Po drugie, brak / obecność końcowego / poprzedzonego ukośnika (
/
) nie powinno powodować zepsucia wszystkiego! Nigdy nie powinieneś robić:a zwłaszcza nie:
Z których właśnie spotkałem się w bazie kodu.
źródło