我可以使用要求(“路径”)。加入安全串连网址吗?(Can I use require(“path”)

2019-09-01 12:21发布

这是安全使用require("path").join来连接的URL,例如:

require("path").join("http://example.com", "ok"); 
//returns 'http://example.com/ok'

require("path").join("http://example.com/", "ok"); 
//returns 'http://example.com/ok'

如果没有,你有什么建议这样做而无需编写代码完全IFS的什么办法吗?

Answer 1:

path.join()与URL中使用时,将返回不正确的值。

这听起来像你想url.resolve 。 从节点文档 :

url.resolve('/one/two/three', 'four')         // '/one/two/four'
url.resolve('http://example.com/', '/one')    // 'http://example.com/one'
url.resolve('http://example.com/one', '/two') // 'http://example.com/two'

编辑:作为安德烈亚斯正确的评论指出, url.resolve只会如果问题是作为例子一样简单帮助。 url.parse也适用于这个问题,因为它返回通过可靠地进行格式化领域URL ,减少了“代码全IFS的”需要的对象。



Answer 2:

不,你不应该使用path.join()加入URL元素。

有一个包这样做了。 因此,而不是推倒重来,所有写你自己的测试,发现漏洞,解决这些问题,编写更多的测试,找到一个边缘情况下它不工作,等等,你可以使用这个包。

网址加盟

https://github.com/jfromaniello/url-join

安装

npm install url-join

用法

var urljoin = require('url-join');

var fullUrl = urljoin('http://www.google.com', 'a', '/b/cd', '?foo=123');

console.log(fullUrl);

打印:

' http://www.google.com/a/b/cd?foo=123 '



Answer 3:

当我试图PATH为串联URL部分我遇到的问题。 PATH.join条纹'//'下调至'/'和这样无效的绝对URL(例如:http:// ... - > HTTP:/ ...)。 对我来说,速战速决是:

baseurl.replace(/\/$/,"") + '/' + path.replace(/^\//,"") )

或张贴恐慌上校的解决方案:

[pathA.replace(/^\/|\/$/g,""),pathB.replace(/^\/|\/$/g,"")].join("/")


Answer 4:

没有! 在Windows path.join将加入反斜杠。 HTTP网址总是正斜杠。

怎么样

> ["posts", "2013"].join("/")
'posts/2013'


Answer 5:

我们这样做是这样的:

var _ = require('lodash');

function urlJoin(a, b) {
  return _.trimEnd(a, '/') + '/' + _.trimStart(b, '/');
}


Answer 6:

这是我使用:

function joinUrlElements() {
  var re1 = new RegExp('^\\/|\\/$','g'),
      elts = Array.prototype.slice.call(arguments);
  return elts.map(function(element){return element.replace(re1,""); }).join('/');
}

例:

url = joinUrlElements(config.mgmtServer, '/v1/o/', config.org, '/apps');


Answer 7:

爱可信有一个辅助功能,可以结合起来的URL。

function combineURLs(baseURL, relativeURL) {
  return relativeURL
    ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
    : baseURL;
}

来源: https://github.com/axios/axios/blob/fe7d09bb08fa1c0e414956b7fc760c80459b0a43/lib/helpers/combineURLs.js



Answer 8:

如果您使用lodash,你可以使用这个简单的oneliner:

// returns part1/part2/part3
['part1/', '/part2', '/part3/'].map((s) => _.trim(s, '/')).join('/')

通过@Peter Dotchev的回答启发



Answer 9:

如果您使用的角度,你可以使用地点 :

import { Location } from '@angular/common';
// ...
Location.joinWithSlash('beginning', 'end');

仅适用于2个参数的,所以你必须链来电或写一个辅助函数这样做,如果需要的。



Answer 10:

打字稿定制的解决方案:

export function pathJoin(parts: string[], sep: string) {
  return parts
    .map(part => {
      const part2 = part.endsWith(sep) ? part.substring(0, part.length - 1) : part;
      return part2.startsWith(sep) ? part2.substr(1) : part2;
    })
    .join(sep);
}

expect(pathJoin(['a', 'b', 'c', 'd'], '/')).toEqual('a/b/c/d');
expect(pathJoin(['a/', '/b/', 'c/', 'd'], '/')).toEqual('a/b/c/d');
expect(pathJoin(['http://abc.de', 'users/login'], '/')).toEqual('http://abc.de/users/login');


文章来源: Can I use require(“path”).join to safely concatenate urls?