175 votes

Puis-je utiliser require("path").join pour concaténer des urls en toute sécurité ?

Peut-on l'utiliser en toute sécurité ? 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'

Si ce n'est pas le cas, quel moyen suggérez-vous pour faire cela sans écrire un code plein de "ifs" ?

210voto

Matthew Bakaitis Points 2728

Non. path.join() renverront des valeurs incorrectes lorsqu'ils seront utilisés avec des URL.

On dirait que vous voulez new URL() . De la Norme URL WHATWG :

new URL('/one', 'http://example.com/').href    // 'http://example.com/one'
new URL('/two', 'http://example.com/one').href // 'http://example.com/two'

Notez que url.resolve est désormais marqué comme obsolète dans le Documents sur les nœuds .

Comme le fait remarquer Andreas dans un commentaire, url.resolve (également déprécié ) ne serait utile que si le problème est aussi simple que l'exemple. url.parse s'applique également à cette question, car il renvoie des champs formatés de manière cohérente et prévisible via la fonction URL qui réduit la nécessité d'un "code plein de si". Cependant, new URL() est également le remplaçant de url.parse .

55voto

skypecakes Points 890

Non, vous ne devez pas utiliser path.join() pour joindre des éléments d'URL.

Il y a un paquet pour faire ça maintenant. Ainsi, 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.

url-joint

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

Installer

npm install url-join

Utilisation

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

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

console.log(fullUrl);

Imprimés :

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

20voto

Sean Murphy Points 1556

Ceci peut être accompli par une combinaison de l'option de Node chemin y URL :

  1. Exigez les paquets :

    const nodeUrl = require('url') const nodePath = require('path')

  2. Commencez par créer un objet URL avec lequel vous pourrez travailler :

    const myUrl = new nodeUrl.URL('https://example.com')

  3. Utilice pathname= y path.join pour construire toutes les combinaisons possibles :

    myUrl.pathname = nodePath.join('/search', 'for', '/something/') '/search/for/something/'

(vous pouvez voir comment le libéral path.join est avec des arguments)

  1. À ce stade, votre URL reflète le résultat final souhaité :

    myUrl.toString() 'https://example.com/search/for/something/'

Pourquoi cette approche ?

Cette technique utilise des bibliothèques intégrées. Moins il y a de dépendances avec des tiers, mieux c'est, en ce qui concerne les CVE, la maintenance, etc.

Rien ne sera plus prouvé ou mieux testé que les libéraux standards.

PS : Ne manipulez jamais les URL comme des chaînes de caractères !

Quand je révise du code, je suis intransigeant sur ne jamais manipuler manuellement les URL en tant que chaînes de caractères . D'abord, regardez comme c'est compliqué la spécification est .

Deuxièmement, l'absence/présence d'une barre oblique traçante/préfixe ( / ) ne doit pas tout casser ! Vous ne devriez jamais le faire :

const url = `${baseUrl}/${somePath}`

et surtout pas :

uri: host + '/' + SAT_SERVICE + '/' + CONSTELLATION + '/',

Dont j'ai vu.

19voto

Ikbel Points 3219

Axios possède une fonction d'aide qui permet de combiner les URL.

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

Source : https://github.com/axios/axios/blob/fe7d09bb08fa1c0e414956b7fc760c80459b0a43/lib/helpers/combineURLs.js

8voto

Coderer Points 5099

Le site Objet URL WHATWG Le constructeur a un (input, base) et la version input peut être relative en utilisant / , ./ , ../ . Combinez cela avec path.posix.join et tu peux tout faire :

const {posix} = require ("path");
const withSlash = new URL("https://example.com:8443/something/");
new URL(posix.join("a", "b", "c"), withSlash).toString(); // 'https://example.com:8443/something/a/b/c'
new URL(posix.join("./a", "b", "c"), withSlash).toString(); // 'https://example.com:8443/something/a/b/c'
new URL(posix.join("/a", "b", "c"), withSlash).toString(); // 'https://example.com:8443/a/b/c'
new URL(posix.join("../a", "b", "c"), withSlash).toString(); // 'https://example.com:8443/a/b/c'
const noSlash = new URL("https://example.com:8443/something");
new URL(posix.join("./a", "b", "c"), noSlash).toString(); // 'https://example.com:8443/a/b/c'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X