>我有一个数组,其中包含大摇大摆使用的网址,如下所示:
["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 的情况下,问题是我不知道如何比较大括号 {} 之间的参数。
我该如何比较这些情况? 与正则表达式? 但我不知道如何构建它。
您可以将字符串分解(方法和路径组件(,然后比较各个部分,下面是一个示例:
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());