[node.js] require ( “path”). join을 사용하여 URL을 안전하게 연결할 수 있습니까?

다음과 같이 require("path").joinURL을 연결하는 데 사용 하는 것이 안전합니까?

require("path").join("http://example.com", "ok");
//returns 'http://example.com/ok'

require("path").join("http://example.com/", "ok");
//returns 'http://example.com/ok'

그렇지 않다면 ifs로 가득 찬 코드를 작성하지 않고이 작업을 수행하는 방법은 무엇입니까?



답변

아니. path.join() . URL과 함께 사용하면 잘못된 값을 반환합니다.

당신이 원하는 것 같은데 url.resolve. 로부터 노드 문서 :

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'

편집 :
Andreas가 의견에서 올바르게 지적했듯이 url.resolve문제가 예제처럼 간단한 경우에만 도움이됩니다. url.parse또한 URL“ifs로 가득 찬 코드”에 대한 필요성을 줄이는 객체를 통해 일관되고 예측 가능한 형식의 필드를 반환하기 때문에이 질문에도 적용됩니다 .


답변

아니요, path.join()URL 요소를 결합 하는 데 사용해서는 안됩니다 .

지금 그렇게하기위한 패키지가 있습니다. 따라서 바퀴를 재발 명하고, 모든 테스트를 작성하고, 버그를 찾고, 수정하고, 더 많은 테스트를 작성하고, 작동하지 않는 엣지 케이스를 찾는 등이 패키지를 사용할 수 있습니다.

URL 조인

https://github.com/jfromaniello/url-join

설치

npm install url-join

용법

var urljoin = require('url-join');

var fullUrl = urljoin('http://www.google.com', 'a', '/b/cd', '?foo=123');

console.log(fullUrl);

인쇄물:

http://www.google.com/a/b/cd?foo=123


답변

Axios 에는 URL을 결합 할 수있는 도우미 기능이 있습니다.

function combineURLs(baseURL, relativeURL) {
  return relativeURL
    ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
    : baseURL;
}

출처 :
https://github.com/axios/axios/blob/fe7d09bb08fa1c0e414956b7fc760c80459b0a43/lib/helpers/combineURLs.js


답변

URL 부분을 연결하기 위해 PATH를 시도했을 때 문제가 발생합니다.
PATH.join‘//’를 ‘/’로 줄이면 절대 URL이 무효화됩니다 (예 : http : // …-> http : / …). 나에게 빠른 수정은 다음과 같습니다.

baseurl.replace(/\/$/,"") + '/' + path.replace(/^\//,"") )

또는 패닉 대령이 게시 한 솔루션 :

[pathA.replace(/^\/|\/$/g,""),pathB.replace(/^\/|\/$/g,"")].join("/")


답변

아니! Windows path.join에서는 백 슬래시로 결합됩니다. HTTP URL은 항상 슬래시입니다.

어때

> ["posts", "2013"].join("/")
'posts/2013'


답변

우리는 다음과 같이합니다.

var _ = require('lodash');

function urlJoin(a, b) {
  return _.trimEnd(a, '/') + '/' + _.trimStart(b, '/');
}


답변

lodash를 사용하는 경우 다음과 같은 간단한 oneliner를 사용할 수 있습니다.

// returns part1/part2/part3
['part1/', '/part2', '/part3/'].map((s) => _.trim(s, '/')).join('/')

@Peter Dotchev의 답변에서 영감을 얻었습니다.