Est-ce sûr à utiliser require("path").join
pour concaténer des URL, par exemple:
require("path").join("http://example.com", "ok");
//returns 'http://example.com/ok'
require("path").join("http://example.com/", "ok");
//returns 'http://example.com/ok'
Sinon, que suggéreriez-vous pour faire cela sans écrire de code plein de ifs?
node.js
url
string-concatenation
Renato Gama
la source
la source
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')
, la jointure élimine l' une des doubles barres obliques danshttp://
'http://localhost:9887/one/two/three/'.replace(/^\/+|\/+$/, '') + '/' + '/four'.replace(/^\/+|\/+$/, '')
et vous pourriez le faireString.prototype.trimSlashes = function() { return this.replace(/^\/+|\/+$/, ''); }
si vous ne voulez pas taper l'expression régulière encore et encore. stackoverflow.com/a/22387870/2537258['http://localhost:9887/one/two/three/', '/four'].map((part) => part. replace(/^\/+|\/+$/, '')).join('/')
Réponses:
No.
path.join()
renverra des valeurs incorrectes lorsqu'il est utilisé avec des URL.On dirait que tu veux
url.resolve
. À partir de la documentation Node :Edit: Comme Andreas le souligne correctement dans un commentaire,
url.resolve
cela n'aiderait que si le problème est aussi simple que l'exemple.url.parse
s'applique également à cette question car elle renvoie des champs formatés de manière cohérente et prévisible via l'URL
objet, ce qui réduit le besoin de «code plein de if».la source
url.resolve('/one/two/three/', 'four')
alors la sortie serait'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'
la réponse est correcteurl.resolve()
ne prend que 2 arguments, où aspath.join()
prend n'importe quel nombre. Donc, selon ce que vous faites, vous devrez peut-être imbriquer des appels, par exemple ..url.resolve(url.resolve(SERVER_URL, pagePath), queryString)
Non, vous ne devez pas utiliser
path.join()
pour joindre des éléments d'URL.Il y a un paquet pour faire ça maintenant. Donc, plutôt que de réinventer la roue, d'écrire tous vos propres tests, de trouver des bogues, de les corriger, d'écrire plus de tests, de trouver un cas limite où cela ne fonctionne pas, etc., vous pouvez utiliser ce paquet.
jointure d'URL
https://github.com/jfromaniello/url-join
Installer
npm install url-join
Usage
Impressions:
" http://www.google.com/a/b/cd?foo=123 "
la source
Axios a une fonction d'assistance qui peut combiner des URL.
la source
Quand j'ai essayé PATH pour concaténer des parties d'url, j'ai rencontré des problèmes.
PATH.join
stripes '//' jusqu'à '/' et de cette façon invalide une URL absolue (par exemple. http: // ... -> http: / ...). Pour moi, une solution rapide était:ou avec la solution publiée par le colonel Panic:
la source
/assets/foo
:? Il en résultera une URL relative au chemin actuelassets/foo
.Non! Sur Windows
path.join
se joindra avec des barres obliques inverses. Les URL HTTP sont toujours des barres obliques.Que diriez-vous
la source
["posts/", "2013"].join("/")
?posts//2013
est toujours une URL valide.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
Nous le faisons comme ceci:
la source
Si vous utilisez lodash , vous pouvez utiliser ce simple oneliner:
inspiré par la réponse de @Peter Dotchev
la source
Si vous utilisez Angular, vous pouvez utiliser Location :
Cela ne fonctionne que sur 2 arguments, vous devez donc enchaîner les appels ou écrire une fonction d'assistance pour le faire si nécessaire.
la source
Voici ce que j'utilise:
exemple:
la source
/assets/foo
:? Il en résultera une URL relative au chemin actuelassets/foo
.L' objet URL WHATWG constructeur a une
(input, base)
version etinput
peut être relatif à l' aide/
,./
,../
. Combinez cela avecpath.posix.join
et vous pouvez tout faire:la source
Solution personnalisée Typescript:
la source
Ma solution
Modifier: si vous souhaitez prendre en charge les environnements Windows
La deuxième solution remplacera toutes les barres obliques inverses, de sorte que les parties d'URL comme la chaîne de requête et le hachage peuvent également être modifiées, mais le sujet ne rejoint que le chemin de l'url, donc je ne considère pas cela comme un problème.
la source
Il y a d'autres réponses de travail, mais je suis allé avec ce qui suit. Un petit combo path.join / URL.
la source
Cela peut être accompli par une combinaison du chemin et de l' URL de Node :
pathname=
etpath.join
pour construire toute combinaison possible:(vous pouvez voir à quel point les
path.join
arguments sont libéraux )Pourquoi cette approche?
Cette technique utilise des bibliothèques intégrées. Moins il y a de dépendances tierces, mieux c'est, en ce qui concerne les CVE, la maintenance, etc.
PS: ne manipulez jamais les URL comme des chaînes!
Lorsque j'examine le code, je suis catégorique sur le fait de ne jamais manipuler manuellement les URL en tant que chaînes . D'une part, regardez à quel point la spécification est compliquée .
Deuxièmement, l'absence / présence d'une barre oblique de fin / préfixée (
/
) ne doit pas tout casser! Vous ne devriez jamais faire:et surtout pas:
Dont je viens de rencontrer dans une base de code.
la source