2012-10-04 49 views
7

Tengo dos partes dinámicas de una URL que estoy tratando de unir para crear una URL completa. Como no sé las cadenas exactas en las que me uniré, quiero utilizar una biblioteca de unión de rutas para evitar errores de unión de cadenas como "http://www.mysite.com/friends//12334.html", que tiene una barra extra, etc.Usando path.join en NodeJS en Windows para crear la URL

Estoy trabajando en una Computadora de casa con Windows 7 usando Node.js.

Intenté utilizar el path de la biblioteca path.join(...), pero como estoy en Windows, giró hacia atrás todas las barras diagonales hacia delante, lo que es obviamente incorrecto para una URL. Ejemplo:

var path = require('path'), 
    joined = path.join('http://www.mysite.com/', '/friends/family'); 

console.log(joined); 
// Prints: 
// http:\www.miserable.com\friends\family 

¿Qué función o biblioteca puedo usar para unir partes de una URL juntas en Windows? Alternativamente, ¿cómo puedo obtener path.join para forzar separadores de estilo UNIX en lugar de los de Windows?

Respuesta

4

Las URL no son rutas de sistema de archivos, por lo que nada en path es aplicable a sus requisitos. Sugeriría usar url.resolve() si satisface sus necesidades, o url.format() si no es así. Tenga en cuenta que no puede simplemente sustituir path.join() en su código, ya que requieren diferentes argumentos. Lea la documentación cuidadosamente.

+0

Ah, gracias. Sabía sobre el módulo 'url' pero no me di cuenta de que' url.resolve' uniría urls. Pensé que 'ruta 'podría ser la siguiente mejor opción. – jdotjdot

+1

Una palabra al sabio de que url.resolve no es una gota en reemplazo para path.join, sino para las URL. Más bien, "tome una URL base y una URL href, y resuélvalas como lo haría un navegador para una etiqueta de anclaje". Específicamente tenga en cuenta que si le da "http://example.com/one" y "dos" le dará "http://example.com/two" y NO "http://example.com/one/ dos" –

2

url.resolve no es lo que pensé que sería, a primera vista ... Note como dir1 se deja caer en el segundo ejemplo

url.resolve('/one/two/three', 'four')   // '/one/two/four' 
url.resolve('http://domain.com/dir1', 'dir2'); // 'http://domain.com/dir2 (dir1 is gone!) 

Aquí está un simple método de unión que escribí:

var _s = require('underscore.string'); 
    /** 
    * Joins part1 and part2 with optional separator (defaults to '/'), 
    * and adds the optional prefix to part1 if specified 
    * 
    * @param {string} part1 
    * @param {string} part2 
    * @param {string} [separator] - defaults to '/' 
    * @param {string} [prefix] - defaults to empty... pass in "http://" for urls if part1 might not already have it. 
    * @returns {string} 
    */ 
    exports.joinWith = function(part1, part2, separator, prefix) { 
     var join = ""; 
     var separatorsFound = 0; 

     if(!separator) { separator = "/"; } 
     if(!prefix) { prefix = ""; } 

     if(_s.endsWith(part1, separator)) { separatorsFound += 1; } 
     if(_s.startsWith(part2, separator)) { separatorsFound += 1; } 

     // See if we need to add a join separator or remove one (if both have it already) 
     if(separatorsFound === 0) { join = separator; } 
     else if(separatorsFound === 2) { part1 = part1.substr(0, part1.length - separator.length); } 

     // Check if prefix is already set 
     if(_s.startsWith(part1, prefix)) { prefix = ""; } 

     return prefix + part1 + join + part2; 
    } 

muestra:

// TEST 
console.log(exports.joinWith('../something', 'else')); 
console.log(exports.joinWith('../something/', 'else')); 

console.log(exports.joinWith('something', 'else', "-")); 
console.log(exports.joinWith('something', 'up', "-is-")); 
console.log(exports.joinWith('something-is-', 'up', "-is-")); 

console.log(exports.joinWith('../something/', '/else')); 
console.log(exports.joinWith('../something/', '/else', "/")); 
console.log(exports.joinWith('somedomain.com', '/somepath', "/")); 
console.log(exports.joinWith('somedomain.com', '/somepath', "/", "http://")); 

console.log(exports.joinWith('', '/somepath', "/")); 

SALIDA:

../something/else 
../something/else 
something-else 
something-is-up 
something-is-up 
../something/else 
../something/else 
somedomain.com/somepath 
http://somedomain.com/somepath 
/somepath