【问题标题】:Check if a url with parameter exists in an array检查数组中是否存在带参数的url
【发布时间】:2020-01-08 08:35:54
【问题描述】:

我有一个数组,其中包含 swagger 使用的 url,例如:

["PATCH /users/{userId}",
"PATCH /users/types/{userIdId}",
"PATCH /products/brands/{brandId}/image",
"PATCH /product-types/{productId}"];

我使用 Mongodb 作为数据库,id 类似,例如userId = "5dce7b7e47224c477734e35d"。这是我的函数中的代码:

var havePerm = false;
var myUrl = "PATCH /users/5dce7b7e47224c477734e35d"
for (var i = 0; i < urls.length; i++) {
   // It compares if: "PATCH /users/5dce7b7e47224c477734e35d" equals "PATCH /users/{userId}"
   if (myUrl === urls[i]) { 
      havePerm = true;
   }
}
return havePerm;

在这种情况下它应该返回 true,但它返回 false。

如果url没有参数(例如:{id}),比较是直接的,但是在PATCH的情况下,问题是我不知道如何比较大括号{}之间的参数。

如何比较这些案例?用正则表达式?但我不知道如何构建它。

【问题讨论】:

  • 您想比较“myUrl”是否匹配其中一种模式? mongoId 是什么?

标签: javascript regex url compare


【解决方案1】:

您可以将字符串分解(方法和路径组件),然后比较各个部分,这是一个示例:

const urls = ["PATCH /users/{userId}",
  "PATCH /users/types/{userIdId}",
  "PATCH /products/brands/{brandId}/image",
  "PATCH /product-types/{productId}"
];

const myUrl = "PATCH /users/5dce7b7e47224c477734e35d";

function parse(str) {
  return str.split(/\s?\//);
}

function isPlaceholder(str) {
  return /\{[^}]+\}/.test(str);
}

function hasPermission() {
  const myUrlParsed = parse(myUrl);
  // check if any of the "urls" elements matches "myUrl"
  return urls.some(url => {
    const parsedUrl = parse(url);
    if (myUrlParsed.length === parsedUrl.length) {
      // check if all the "myUrlParsed" elements match all "parsedUrl" elements at the coresponding index or if the "parsedUrl" element is a placeholder
      return myUrlParsed.every((v, i) => v === parsedUrl[i] || isPlaceholder(parsedUrl[i]));
    }
    return false;
  });
}

console.log("has permission:", hasPermission());

这样做的目的是将每个 url 分解成一个如下所示的数组:

["PATCH", "users", "{userId}"]

然后再根据myUrl 字符串生成的数组检查每种类型的数组。

检查查看对应索引处的每个数组元素是否相等,或者该元素是否为占位符(以{ 开头,以} 结尾)。

另一种方法是将 url 转换为正则表达式,这是一个示例:

let urls = ["PATCH /users/{userId}",
  "PATCH /users/types/{userIdId}",
  "PATCH /products/brands/{brandId}/image",
  "PATCH /product-types/{productId}"
];
const myUrl = "PATCH /users/5dce7b7e47224c477734e35d";

function escapeRegex(s) {
  return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};

urls = urls.map(url => {
  const regExpStr = url.split(/\{[^\}]+\}/)
    .map(escapeRegex)
    .join('[^\/]+');
  return new RegExp(regExpStr);
});

function hasPermission() {
  return urls.some(url => url.test(myUrl));
}

console.log("Has permission:", hasPermission());

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多