É seguro usar require("path").join
para concatenar URLs, por exemplo:
require("path").join("http://example.com", "ok");
//returns 'http://example.com/ok'
require("path").join("http://example.com/", "ok");
//returns 'http://example.com/ok'
Caso contrário, de que maneira você sugeriria isso sem escrever um código cheio de ifs?
node.js
url
string-concatenation
Renato Gama
fonte
fonte
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')
, a junção se livrar de uma das barras duplas nahttp://
'http://localhost:9887/one/two/three/'.replace(/^\/+|\/+$/, '') + '/' + '/four'.replace(/^\/+|\/+$/, '')
e você poderia fazerString.prototype.trimSlashes = function() { return this.replace(/^\/+|\/+$/, ''); }
se você não deseja digitar a expressão regular e outra vez. stackoverflow.com/a/22387870/2537258['http://localhost:9887/one/two/three/', '/four'].map((part) => part. replace(/^\/+|\/+$/, '')).join('/')
Respostas:
No.
path.join()
retornará valores incorretos quando usado com URLs.Parece que você quer
url.resolve
. Nos documentos do Node :Editar: como Andreas corretamente indica em um comentário,
url.resolve
só ajudaria se o problema fosse tão simples quanto o exemplo.url.parse
também se aplica a essa pergunta porque retorna campos formatados de forma consistente e previsível por meio doURL
objeto que reduz a necessidade de "código cheio de ifs".fonte
url.resolve('/one/two/three/', 'four')
, a saída seria'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'
a resposta está corretaurl.resolve()
apenas 2 argumentos, enquanto quepath.join()
qualquer número. Então, dependendo do que você está fazendo você pode precisar de chamadas ninho, por exemplo ..url.resolve(url.resolve(SERVER_URL, pagePath), queryString)
Não, você não deve usar
path.join()
para associar elementos de URL.Há um pacote para fazer isso agora. Então, em vez de reinventar a roda, escreva todos os seus próprios testes, encontre bugs, corrija-os, escreva mais testes, encontre um caso de borda onde não funcione etc., você pode usar este pacote.
junção de URL
https://github.com/jfromaniello/url-join
Instalar
npm install url-join
Uso
Impressões:
' http://www.google.com/a/b/cd?foo=123 '
fonte
O Axios possui uma função auxiliar que pode combinar URLs.
fonte
Quando tentei o PATH para concatenar partes de URL, me deparei com problemas.
PATH.join
listras '//' até '/' e, dessa forma, invalida um URL absoluto (por exemplo, http: // ... -> http: / ...). Para mim, uma solução rápida foi:ou com a solução postada pelo coronel Panic:
fonte
/assets/foo
:? Isso resultará em URL relativo ao caminho atualassets/foo
.Não! No Windows
path.join
se juntará às barras invertidas. URLs HTTP sempre são barras.E se
fonte
["posts/", "2013"].join("/")
:?posts//2013
ainda é um URL válido.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
Fazemos assim:
fonte
Se você estiver usando o lodash , poderá usar este oneliner simples:
inspirado na resposta de @Peter Dotchev
fonte
Isto é o que eu uso:
exemplo:
fonte
/assets/foo
:? Isso resultará em URL relativo ao caminho atualassets/foo
.Se você usa Angular, pode usar Local :
Funciona apenas com 2 argumentos, portanto, você deve encadear chamadas ou escrever uma função auxiliar para fazer isso, se necessário.
fonte
O objeto WHATWG URL construtor tem uma
(input, base)
versão eoinput
pode ser relativo usando/
,./
,../
. Combine isso compath.posix.join
e você pode fazer qualquer coisa:fonte
Solução personalizada datilografada:
fonte
Minha solução
Editar: se você deseja oferecer suporte ao ambiente do Windows
A segunda solução substituirá todas as barras invertidas; portanto, partes de URL, como querystring e hash, também podem ser alteradas, mas o tópico está se unindo apenas ao caminho da URL, por isso não considero um problema.
fonte
Existem outras respostas úteis, mas eu fui com o seguinte. Uma pequena combinação path.join / URL.
fonte
Isso pode ser realizado por uma combinação do caminho e da URL do nó :
pathname=
epath.join
para construir qualquer combinação possível:(você pode ver o quão liberal
path.join
é com argumentos)Por que essa abordagem?
Essa técnica usa bibliotecas internas. Quanto menos dependências de terceiros, melhor, quando se trata de CVEs, manutenção etc.
PS: nunca manipule URLs como strings!
Ao revisar o código, sou inflexível sobre nunca manipular URLs como sequências manualmente . Por um lado, veja como a especificação é complicada .
Em segundo lugar, a ausência / presença de uma barra final / prefixada (
/
) não deve fazer com que tudo quebre! Você nunca deve fazer:e especialmente não:
Dos quais eu acabei de encontrar em uma base de código.
fonte