Can I use require("path").join to safely concatenate urls?
No. path.join()
will return incorrect values when used with URLs.
It sounds like you want new URL()
. From the WHATWG URL Standard:
new URL('/one', 'http://example.com/').href // 'http://example.com/one'
new URL('/two', 'http://example.com/one').href // 'http://example.com/two'
Note that url.resolve
is now marked as deprecated in the Node docs.
As Andreas correctly points out in a comment, url.resolve
(also deprecated) would only help if the problem is as simple as the example. url.parse
also applies to this question because it returns consistently and predictably formatted fields via the URL
object that reduces the need for "code full of ifs". However, new URL()
is also the replacement for url.parse
.
No, you should not use path.join()
to join URL elements.
There's a package for doing that now. So rather than reinvent the wheel, write all your own tests, find bugs, fix them, write more tests, find an edge case where it doesn't work, etc., you could use this package.
url-join
https://github.com/jfromaniello/url-join
Install
npm install url-join
Usage
var urljoin = require('url-join');
var fullUrl = urljoin('http://www.google.com', 'a', '/b/cd', '?foo=123');
console.log(fullUrl);
Prints:
'http://www.google.com/a/b/cd?foo=123'
Axios has a helper function that can combine URLs.
function combineURLs(baseURL, relativeURL) {
return relativeURL
? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
: baseURL;
}
Source: https://github.com/axios/axios/blob/fe7d09bb08fa1c0e414956b7fc760c80459b0a43/lib/helpers/combineURLs.js