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" ?

2voto

Cheeso Points 87022

C'est ce que j'utilise :

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

exemple :

url = joinUrlElements(config.mgmtServer, '/v1/o/', config.org, '/apps');

1voto

Neil Guy Lindberg Points 1089

Il y a d'autres réponses qui fonctionnent, mais j'ai choisi la suivante. Un petit combo path.join/URL.

const path = require('path');
//
const baseUrl = 'http://ejemplo.mx';
// making odd shaped path pieces to see how they're handled.
const pieces = ['way//', '//over/', 'there/'];
//
console.log(new URL(path.join(...pieces), baseUrl).href);
// http://ejemplo.mx/way/over/there/

// path.join expects strings. Just an example how to ensure your pieces are Strings.
const allString = ['down', 'yonder', 20000].map(String);
console.log(new URL(path.join(...allString), baseUrl).href);
// http://ejemplo.mx/down/yonder/20000

1voto

blindProgrammer Points 425

Le temps de poster cette réponse url.resolve() est déprécié ;

J'ai fait ce qui suit pour joindre au chemin dans Nodejs :

const path = require('path');
const url = require('url');

let myUrl = new URL('http://ignore.com');
myUrl.pathname=path.join(firstpath, secondpath);
console.log(myUrl.pathname)

Cette approche enregistre le chemin d'accès correct à l'URL et fonctionne dans mon cas.

Quelle est votre opinion sur cette approche ?

Gracias

0voto

Patrick Wozniak Points 469

Solution personnalisée Typescript :

export function pathJoin(parts: string[], sep: string) {
  return parts
    .map(part => {
      const part2 = part.endsWith(sep) ? part.substring(0, part.length - 1) : part;
      return part2.startsWith(sep) ? part2.substr(1) : part2;
    })
    .join(sep);
}

expect(pathJoin(['a', 'b', 'c', 'd'], '/')).toEqual('a/b/c/d');
expect(pathJoin(['a/', '/b/', 'c/', 'd'], '/')).toEqual('a/b/c/d');
expect(pathJoin(['http://abc.de', 'users/login'], '/')).toEqual('http://abc.de/users/login');

0voto

Killy Points 170

Ma solution

path.join(SERVER_URL, imageAbsolutePath).replace(':/','://');

Edit : si vous voulez supporter les environnements Windows

path.join(SERVER_URL, imageAbsolutePath).replace(/\\/g,'/').replace(':/','://');

La deuxième solution remplacera tous les antislashes, donc les parties de l'url comme la querystring et le hash peuvent être modifiées aussi, mais le sujet rejoint juste le chemin de l'url, donc je ne considère pas cela comme un problème.

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