我有两个动态的网址,我正在尝试连接在一起制作完整的网址。由于我不知道我将加入的确切字符串,我想使用路径连接库来避免字符串连接错误,如"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?
答案 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'