8

完全なURLを作成するために結合しようとしているURLの2つの動的な部分があります。結合する正確な文字列がわからないため、パス結合ライブラリを使用し"http://www.mysite.com/friends//12334.html"て、余分なスラッシュなどがある文字列結合エラーを回避したいと思います。

Node.jsを使用してWindows7ホームコンピューターで作業しています。

pathライブラリのを使用してみましたpath.join(...)が、Windowsを使用しているため、スラッシュがすべて逆方向になりました。これは、URLでは明らかに正しくありません。例:

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の一部を結合するために使用できる関数またはライブラリは何ですか?path.joinまたは、 WindowsではなくUNIXスタイルのセパレータを強制するにはどうすればよいですか?

4

3 に答える 3

5

URLはファイルシステムパスではないためpath、要件に適用できるものはありません。url.resolve()それがあなたのニーズを満たしているかどうかを使用することをお勧めしますurl.format()path.join()異なる引数を必要とするため、コード内でどちらかを単純に置き換えることはできないことに注意してください。ドキュメントを注意深く読んでください。

于 2012-10-04T08:13:22.720 に答える
3

... path.joinを取得して、WindowsではなくUNIXスタイルのセパレーターを強制するにはどうすればよいですか?

(@ebohlmanが指摘したように)URLはファイルシステムパスではありませんが、コンポーネントpath.posix.join()の作成に使用できます。URL.pathname

const path = require('path');
const url = require('url');

const origin = 'http://www.example.com/';
const pathname = path.posix.join(path.posix.sep, 'friends', 'family');

// All at once...
const myURL = new URL(pathname, origin);
console.log(myURL.href);
// => 'http://www.example.com/friends/family'

// In steps...
const myURL2 = new URL(origin);
console.log(myURL2.href);
// => 'http://www.example.com/'
myURL2.pathname = pathname;
console.log(myURL2.href);
// => 'http://www.example.com/friends/family'
于 2019-01-25T15:19:17.280 に答える
2

url.resolve一見すると思っていたものではありません...2番目の例で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', "/") );

出力:

../something/else
../something/else
something-else
something-is-up
something-is-up
../something/else
../something/else
somedomain.com/somepath
http://somedomain.com/somepath
/somepath
于 2014-03-27T02:04:07.967 に答える