Ist dies sicher zum require("path").join
Verketten von URLs, zum Beispiel:
require("path").join("http://example.com", "ok");
//returns 'http://example.com/ok'
require("path").join("http://example.com/", "ok");
//returns 'http://example.com/ok'
Wenn nicht, wie würden Sie dies vorschlagen, ohne Code voller Wenns zu schreiben?
node.js
url
string-concatenation
Renato Gama
quelle
quelle
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')
, der Join einen der doppelten Schrägstriche inhttp://
'http://localhost:9887/one/two/three/'.replace(/^\/+|\/+$/, '') + '/' + '/four'.replace(/^\/+|\/+$/, '')
und können dies tun,String.prototype.trimSlashes = function() { return this.replace(/^\/+|\/+$/, ''); }
wenn Sie den regulären Ausdruck nicht immer wieder eingeben möchten . stackoverflow.com/a/22387870/2537258['http://localhost:9887/one/two/three/', '/four'].map((part) => part. replace(/^\/+|\/+$/, '')).join('/')
Antworten:
Nein.
path.join()
Gibt bei Verwendung mit URLs falsche Werte zurück.Es klingt wie du willst
url.resolve
. Aus den Knotendokumenten :Bearbeiten: Wie Andreas in einem Kommentar richtig hervorhebt,
url.resolve
würde nur helfen, wenn das Problem so einfach ist wie im Beispiel.url.parse
Dies gilt auch für diese Frage, da über dasURL
Objekt konsistent und vorhersehbar formatierte Felder zurückgegeben werden , wodurch der Bedarf an "Code voller Ifs" verringert wird.quelle
url.resolve('/one/two/three/', 'four')
wäre, wäre die Ausgabe'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'
in der Antwort ist richtigurl.resolve()
nur 2 Argumente verwendet werden, wobeipath.join()
eine beliebige Zahl verwendet wird. Je nachdem, was Sie tun, müssen Sie möglicherweise Anrufe verschachteln, z. B.url.resolve(url.resolve(SERVER_URL, pagePath), queryString)
Nein, Sie sollten keine
path.join()
URL-Elemente verknüpfen.Dafür gibt es jetzt ein Paket. Anstatt das Rad neu zu erfinden, alle Ihre eigenen Tests zu schreiben, Fehler zu finden, sie zu beheben, weitere Tests zu schreiben, einen Randfall zu finden, in dem es nicht funktioniert usw., könnten Sie dieses Paket verwenden.
URL-Join
https://github.com/jfromaniello/url-join
Installieren
npm install url-join
Verwendung
Drucke:
" http://www.google.com/a/b/cd?foo=123 "
quelle
Axios verfügt über eine Hilfsfunktion, mit der URLs kombiniert werden können.
quelle
Als ich PATH zum Verketten von URL-Teilen ausprobiert habe, sind Probleme aufgetreten.
PATH.join
Streifen '//' bis '/' und auf diese Weise wird eine absolute URL ungültig (z. B. http: // ... -> http: / ...). Für mich war eine schnelle Lösung:oder mit der von Colonel Panic veröffentlichten Lösung:
quelle
/assets/foo
? Daraus ergibt sich eine URL, die sich auf den aktuellen Pfad beziehtassets/foo
.Nein! Unter Windows
path.join
werden Backslashes hinzugefügt. HTTP-URLs sind immer Schrägstriche.Wie wäre es mit
quelle
["posts/", "2013"].join("/")
?posts//2013
ist immer noch eine gültige 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
Wir machen es so:
quelle
Wenn Sie lodash verwenden , können Sie diesen einfachen Oneliner verwenden:
inspiriert von @Peter Dotchevs Antwort
quelle
Das benutze ich:
Beispiel:
quelle
/assets/foo
? Daraus ergibt sich eine URL, die sich auf den aktuellen Pfad beziehtassets/foo
.Wenn Sie Angular verwenden, können Sie Location verwenden :
Funktioniert jedoch nur mit 2 Argumenten, sodass Sie bei Bedarf Aufrufe verketten oder eine Hilfsfunktion schreiben müssen, um dies zu tun.
quelle
Das WHATWG URL - Objekt Konstruktor hat eine
(input, base)
Version, und dasinput
kann mit relativ sein/
,./
,../
. Kombinieren Sie dies mitpath.posix.join
und Sie können alles tun:quelle
Benutzerdefinierte Typoskript-Lösung:
quelle
Meine Lösung
Bearbeiten: Wenn Sie Windows-Umgebungen unterstützen möchten
Die zweite Lösung ersetzt alle Backslashes, sodass URL-Teile wie Querystring und Hash ebenfalls geändert werden können, das Thema jedoch nur den URL-Pfad verbindet, sodass ich es nicht als Problem betrachte.
quelle
Es gibt andere funktionierende Antworten, aber ich ging mit den folgenden. Eine kleine Kombination aus path.join und URL.
quelle
Dies kann durch eine Kombination von Knoten des erreicht werden Pfad und URL :
pathname=
undpath.join
konstruieren Sie eine mögliche Kombination:(Sie können sehen, wie liberal
path.join
mit Argumenten ist)Warum dieser Ansatz?
Diese Technik verwendet integrierte Bibliotheken. Je weniger Abhängigkeiten von Drittanbietern, desto besser, wenn es um CVEs, Wartung usw. geht.
PS: Manipuliere niemals URLs als Strings!
Wenn ich Code überprüfe, bin ich fest davon überzeugt , URLs niemals manuell als Zeichenfolgen zu bearbeiten . Schauen Sie sich zum einen an, wie kompliziert die Spezifikation ist .
Zweitens sollte das Fehlen / Vorhandensein eines abschließenden / vorangestellten Schrägstrichs (
/
) nicht dazu führen, dass alles kaputt geht! Sie sollten niemals tun:und vor allem nicht:
Davon bin ich gerade in einer Codebasis begegnet.
quelle