167

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 でいっぱいのコードを書かずにこれを行うには、どのような方法をお勧めしますか?

4

15 に答える 15

204

いいえpath.join()。URL で使用すると、正しくない値が返されます。

みたいですねnew URL()WHATWG URL 標準から:

new URL('/one', 'http://example.com/').href    // 'http://example.com/one'
new URL('/two', 'http://example.com/one').href // 'http://example.com/two'

Node docsurl.resolveで deprecated とマークされていることに注意してください。

アンドレアスがコメントで正しく指摘しているように、url.resolve(これも非推奨) は、問題が例のように単純な場合にのみ役立ちます。 url.parseこの質問にも当てはまります。これは、オブジェクトを介して一貫して予測可能な形式のフィールドを返しURL、「if でいっぱいのコード」の必要性を減らすためです。ただし、new URL()の置き換えでもありurl.parseます。

于 2013-04-30T14:07:04.187 に答える
55

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 '

于 2016-09-28T05:10:48.963 に答える
17

これは、ノードのパスURLの組み合わせによって実現できます。

  1. パッケージが必要です:
const nodeUrl = require('url')
const nodePath = require('path')
  1. 操作する URL オブジェクトを作成することから始めます。
> const myUrl = new nodeUrl.URL('https://example.com')
  1. と を使用pathname=path.joinて、可能な組み合わせを作成します。
> myUrl.pathname = nodePath.join('/search', 'for', '/something/')
'/search/for/something/'

(議論でいかにリベラルかがわかりpath.joinます)

  1. この時点で、URL は最終的に望ましい結果を反映しています。
> myUrl.toString()
'https://example.com/search/for/something/'

なぜこのアプローチ?

この手法では、組み込みライブラリを使用します。CVEやメンテナンスなどに関しては、サードパーティの依存関係が少ないほど良い.

標準ライブラリほど実証済みまたはテスト済みのものはありません。

PS: URL を文字列として操作しないでください。

コードをレビューするとき、URL を文字列として手動で操作することは絶対にしないと断言しています。まず、仕様がいかに複雑かを見てください。

第二に、末尾/接頭辞付きのスラッシュ ( ) の有無によって、/すべてが壊れるわけではありません。あなたは決してすべきではありません:

const url = `${baseUrl}/${somePath}`

特にそうではありません:

uri: host + '/' + SAT_SERVICE + '/' + CONSTELLATION + '/',

私が見たもの。

于 2020-07-23T06:33:27.573 に答える
6

URL 部分を連結するために PATH を試したところ、問題が発生しました。 PATH.join'//' を '/' にストライプし、この方法で絶対 URL を無効にします (例: http://... -> http:/...)。私にとって簡単な修正は次のとおりです。

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

または、パニック大佐によって投稿されたソリューションを使用します。

[pathA.replace(/^\/|\/$/g,""),pathB.replace(/^\/|\/$/g,"")].join("/")
于 2013-06-06T11:46:08.577 に答える
5

次のようにします。

var _ = require('lodash');

function urlJoin(a, b) {
  return _.trimEnd(a, '/') + '/' + _.trimStart(b, '/');
}
于 2016-02-08T14:49:31.690 に答える
2

これは私が使用するものです:

function joinUrlElements() {
  var re1 = new RegExp('^\\/|\\/$','g'),
      elts = Array.prototype.slice.call(arguments);
  return elts.map(function(element){return element.replace(re1,""); }).join('/');
}

例:

url = joinUrlElements(config.mgmtServer, '/v1/o/', config.org, '/apps');
于 2015-02-18T19:46:06.467 に答える