¿Es seguro usarlo 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 es así, ¿qué manera sugeriría para hacer esto sin escribir un código lleno de if?
node.js
url
string-concatenation
Renato Gama
fuente
fuente
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 combinación elimina una de las barras dobles enhttp://
'http://localhost:9887/one/two/three/'.replace(/^\/+|\/+$/, '') + '/' + '/four'.replace(/^\/+|\/+$/, '')
y podría hacerloString.prototype.trimSlashes = function() { return this.replace(/^\/+|\/+$/, ''); }
si no desea escribir la expresión regular una y otra vez. stackoverflow.com/a/22387870/2537258['http://localhost:9887/one/two/three/', '/four'].map((part) => part. replace(/^\/+|\/+$/, '')).join('/')
Respuestas:
No.
path.join()
devolverá valores incorrectos cuando se use con URL.Suena como si quisieras
url.resolve
. De los documentos de Node :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 delURL
objeto que reduce la necesidad de "código lleno de ifs".fuente
url.resolve('/one/two/three/', 'four')
, la salida sería'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 respuesta es correctaurl.resolve()
solo toma 2 argumentos, donde aspath.join()
toma cualquier número. Entonces, dependiendo de lo que estés haciendo, es posible queurl.resolve(url.resolve(SERVER_URL, pagePath), queryString)
No, no debe utilizar
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, corregirlos, escribir más pruebas, encontrar un caso extremo donde no funcione, etc., podría usar este paquete.
url-join
https://github.com/jfromaniello/url-join
Instalar en pc
npm install url-join
Uso
Huellas dactilares:
' http://www.google.com/a/b/cd?foo=123 '
fuente
Axios tiene una función auxiliar que puede combinar URL.
fuente
Cuando probé PATH para concatenar partes de URL, me encontré con problemas.
PATH.join
rayas '//' hasta '/' y de esta manera invalida una URL absoluta (por ejemplo, http: // ... -> http: / ...). Para mí, una solución rápida fue:o con la solución publicada por Colonel Panic:
fuente
/assets/foo
:? Dará como resultado una URL relativa a la ruta actualassets/foo
.¡No! En Windows
path.join
se unirá con barras invertidas. Las URL HTTP son siempre barras inclinadas.Qué tal si
fuente
["posts/", "2013"].join("/")
:?posts//2013
sigue siendo una URL válida.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
Lo hacemos así:
fuente
Si está usando lodash , puede usar este sencillo delineador:
inspirado en la respuesta de @Peter Dotchev
fuente
Si usa Angular, puede usar Location :
Sin embargo, solo funciona con 2 argumentos, por lo que debe encadenar llamadas o escribir una función auxiliar para hacerlo si es necesario.
fuente
Esto es lo que uso:
ejemplo:
fuente
/assets/foo
:? Dará como resultado una URL relativa a la ruta actualassets/foo
.El objeto WHATWG URL constructor tiene una
(input, base)
versión y elinput
puede ser relativa usando/
,./
,../
. Combine esto conpath.posix.join
y puede hacer cualquier cosa:fuente
Solución personalizada de TypeScript:
fuente
Mi solución
Editar: si desea admitir entornos de Windows
La segunda solución reemplazará todas las barras invertidas, por lo que las partes de la URL como la cadena de consulta y el hash también pueden modificarse, pero el tema se une solo a la ruta de la URL, por lo que no lo considero un problema.
fuente
Hay otras respuestas que funcionan, pero fui con lo siguiente. Un pequeño combo path.join / URL.
fuente
Esto se puede lograr mediante una combinación de la ruta y la URL del nodo :
pathname=
ypath.join
para construir cualquier combinación posible:(puedes ver lo liberal que
path.join
es con los argumentos)¿Por qué este enfoque?
Esta técnica utiliza bibliotecas integradas. Cuantas menos dependencias de terceros, mejor, cuando se trata de CVE, mantenimiento, etc.
PD: ¡Nunca manipules las URL como cadenas!
Cuando reviso el código, soy inflexible sobre nunca manipular las URL como cadenas manualmente . Por un lado, mire lo complicada que es la especificación .
En segundo lugar, la ausencia / presencia de una barra inclinada (
/
) al final o prefijada no debería hacer que todo se rompa. Nunca deberías hacer:y especialmente no:
De los cuales acabo de encontrar en una base de código.
fuente