在Windows上使用NodeJS上的path.join创建URL

时间:2012-10-04 08:05:48

标签: windows node.js url path

我有两个动态的网址,我正在尝试连接在一起制作完整的网址。由于我不知道我将加入的确切字符串,我想使用路径连接库来避免字符串连接错误,如"http://www.mysite.com/friends//12334.html",它有一个额外的斜杠等。

我正在使用Node.js在Windows 7家庭计算机上工作。

我尝试使用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强制使用UNIX风格的分隔符而不是Windows?

3 个答案:

答案 0 :(得分:4)

网址不是文件系统路径,因此path中的任何内容都不适用于您的要求。如果符合您的需求,我建议您使用url.resolve(),如果不符合,我建议使用url.format()。请注意,您不能简单地在代码中替换path.join(),因为它们需要不同的参数。仔细阅读文档。

答案 1 :(得分: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', "/") );

输出:

../something/else
../something/else
something-else
something-is-up
something-is-up
../something/else
../something/else
somedomain.com/somepath
http://somedomain.com/somepath
/somepath

答案 2 :(得分:0)

  

...如何获取path.join以强制使用UNIX样式的分隔符,而不是Windows的分隔符?

尽管URL(不是@ebohlman指出的)不是文件系统路径,但可以使用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'