node.js - query - ¿Puedo usar require("ruta"). Join para concatenar urls de forma segura?
url query node js (8)
¿Es seguro utilizar? require("path").join
para concatenar URL, por ejemplo:
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 no, ¿de qué manera sugerirías hacer esto sin escribir un código lleno de ifs?
¡No! En Windows, path.join
se unirá con barras diagonales inversas. Las URL HTTP son siempre barras diagonales.
Qué tal si
> ["posts", "2013"].join("/")
''posts/2013''
Cuando probé PATH para concatenar partes de url me encontré con problemas. PATH.join
stripes ''//'' hasta ''/'' y de esta forma invalida una url absoluta (ej. Http: // ... -> http: / ...). Para mí, una solución rápida fue:
baseurl.replace(///$/,"") + ''/'' + path.replace(/^///,"") )
o con la solución publicada por el coronel Panic:
[pathA.replace(/^//|//$/g,""),pathB.replace(/^//|//$/g,"")].join("/")
Esto es lo que uso:
function joinUrlElements() {
var re1 = new RegExp(''^///|///$'',''g''),
elts = Array.prototype.slice.call(arguments);
return elts.map(function(element){return element.replace(re1,""); }).join(''/'');
}
ejemplo:
url = joinUrlElements(config.mgmtServer, ''/v1/o/'', config.org, ''/apps'');
Lo hacemos así:
var _ = require(''lodash'');
function urlJoin(a, b) {
return _.trimEnd(a, ''/'') + ''/'' + _.trimStart(b, ''/'');
}
No, no debe usar path.join()
para unir elementos de URL.
Hay un paquete para hacer eso ahora. Entonces, en lugar de reinventar la rueda, escribir todas sus propias pruebas, encontrar errores, arreglarlos, escribir más pruebas, encontrar un caso límite donde no funcione, etc., podría usar este paquete.
url-join
https://github.com/jfromaniello/url-join
Instalar
npm install url-join
Uso
var urljoin = require(''url-join'');
var fullUrl = urljoin(''http://www.google.com'', ''a'', ''/b/cd'', ''?foo=123'');
console.log(fullUrl);
Huellas dactilares:
No. path.join()
devolverá valores incorrectos cuando se use con URL.
Parece que quieres url.resolve
. De los documentos del nodo :
url.resolve(''/one/two/three'', ''four'') // ''/one/two/four''
url.resolve(''http://example.com/'', ''/one'') // ''http://example.com/one''
url.resolve(''http://example.com/one'', ''/two'') // ''http://example.com/two''
Editar: Como Andreas señala correctamente en un comentario, url.resolve
solo ayudaría si el problema es tan simple como el ejemplo. url.parse
también se aplica a esta pregunta porque devuelve campos formateados de manera consistente y predecible a través del objeto URL
que reduce la necesidad de un "código lleno de ifs".
Si está utilizando lodash , puede usar este simple oneliner:
// returns part1/part2/part3
[''part1/'', ''/part2'', ''/part3/''].map((s) => _.trim(s, ''/'')).join(''/'')
inspirado en la respuesta de @Peter Dotchev
Axios tiene una función auxiliar que puede combinar URLs.
function combineURLs(baseURL, relativeURL) {
return relativeURL
? baseURL.replace(///+$/, '''') + ''/'' + relativeURL.replace(/^//+/, '''')
: baseURL;
}