2012-10-04 11 views
7

完全なURLを作成するために一緒に参加しようとしている2つの動的なURLがあります。正確な文字列がわからないので、パス結合ライブラリを使用して、文字列結合エラー("http://www.mysite.com/friends//12334.html"など)に余分なスラッシュなどを入れたいと考えています。Windows上のNodeJSでpath.joinを使用してURLを作成する

Node.jsを使用するWindows 7 Homeコンピュータ

pathライブラリのpath.join(...)を使用しようとしましたが、私がWindows上にいるため、すべてのスラッシュが逆方向になりました。例:

var path = require('path'), 
    joined = path.join('http://www.mysite.com/', '/friends/family'); 

console.log(joined); 
// Prints: 
// http:\www.miserable.com\friends\family 

Windows上でURLの一部を一緒に参加させるにはどのような関数またはライブラリを使用できますか?あるいは、Windowsのものではなく、UNIXスタイルのセパレータを強制的に適用するには、どうすればpath.joinを入手できますか?

答えて

4

URLはファイルシステムのパスではないため、お客様の要件にはpathのものはありません。私はそれがあなたのニーズを満たす場合はurl.resolve()、そうでない場合はurl.format()を使用することをお勧めします。別の引数が必要なため、コード内でpath.join()のどちらかを単に代用することはできません。マニュアルをよく読んでください。

+0

ああ、ありがとう。私は 'url'モジュールについて知っていましたが、' url.resolve'が一緒にURLを結合することに気づいていませんでした。私は 'パス'が次善策かもしれないと思った。 – jdotjdot

+1

url.resolveは、path.joinの代わりにURLの代わりにドロップされるわけではありません。むしろ "基本URLとhref URLをとり、アンカータグの場合と同様にブラウザを解決してください。"具体的には、 "http://example.com/one"と "two"を指定すると、 "http://example.com/two"と表示され、 "http://example.com/one/"ではなく二" –

2

url.resolveは、私はそれが一見だろうと思ったものではありません... DIR1は、第二の例ではドロップされるか

url.resolve('/one/two/three', 'four')   // '/one/two/four' 
url.resolve('http://domain.com/dir1', 'dir2'); // 'http://domain.com/dir2 (dir1 is gone!) 

に注意してくださいここで私が書いた簡単な参加方法です:

var _s = require('underscore.string'); 
    /** 
    * Joins part1 and part2 with optional separator (defaults to '/'), 
    * and adds the optional prefix to part1 if specified 
    * 
    * @param {string} part1 
    * @param {string} part2 
    * @param {string} [separator] - defaults to '/' 
    * @param {string} [prefix] - defaults to empty... pass in "http://" for urls if part1 might not already have it. 
    * @returns {string} 
    */ 
    exports.joinWith = function(part1, part2, separator, prefix) { 
     var join = ""; 
     var separatorsFound = 0; 

     if(!separator) { separator = "/"; } 
     if(!prefix) { prefix = ""; } 

     if(_s.endsWith(part1, separator)) { separatorsFound += 1; } 
     if(_s.startsWith(part2, separator)) { separatorsFound += 1; } 

     // See if we need to add a join separator or remove one (if both have it already) 
     if(separatorsFound === 0) { join = separator; } 
     else if(separatorsFound === 2) { part1 = part1.substr(0, part1.length - separator.length); } 

     // Check if prefix is already set 
     if(_s.startsWith(part1, prefix)) { prefix = ""; } 

     return prefix + part1 + join + part2; 
    } 
は、

サンプル:

// TEST 
console.log(exports.joinWith('../something', 'else')); 
console.log(exports.joinWith('../something/', 'else')); 

console.log(exports.joinWith('something', 'else', "-")); 
console.log(exports.joinWith('something', 'up', "-is-")); 
console.log(exports.joinWith('something-is-', 'up', "-is-")); 

console.log(exports.joinWith('../something/', '/else')); 
console.log(exports.joinWith('../something/', '/else', "/")); 
console.log(exports.joinWith('somedomain.com', '/somepath', "/")); 
console.log(exports.joinWith('somedomain.com', '/somepath', "/", "http://")); 

console.log(exports.joinWith('', '/somepath', "/")); 

OUTPUT:

../something/else 
../something/else 
something-else 
something-is-up 
something-is-up 
../something/else 
../something/else 
somedomain.com/somepath 
http://somedomain.com/somepath 
/somepath 
関連する問題