我有一个包含path-api映射的数组,如下所示:
var apiArray = [
{
"api" : "login",
"path" : "/auth/login",
"method" : "POST"
},
{
"api" : "logout",
"path" : "/auth/logout/{sessionId}",
"method" : "POST"
},
{
"api" : "getAsset",
"path" : "/asset/{Id}",
"method" : "GET"
},
{
"api" : "getAssetScheme",
"path" : "/asset/Scheme/{Id}",
"method" : "GET"
}
];
每当请求服务时,我需要将http请求中的url与上面数组中的path属性相匹配,以找出调用了哪个api。
之类的东西function getApiName(apiArray, reqPath){
// compares reqPath with the path property of each element in the array
// returns the name of the api for path that matched.
for(var i=0; i < apiArray.length;i++){
if(apiArray[i].path=== reqPath) return apiArray[i].api;
}
return null;
}
对于没有路径或查询参数的简单api,这个逻辑工作正常。但案件不合格:
1. apis with path参数:ex:logout,getAsset,它有一个path参数(分别是sessionId和Id)。在这种情况下,
reqPath =“/ auth / logout / 55ffc09e56eb79c737c7aac6”。
2.带有查询参数的apis:这里,
reqPath =“/ tree / getTree /?subTree = true&amp;&amp; type = node”。
如何修改我的函数'getApiName'以支持带有查询和路径参数的apis?
另外,我可能不得不支持一个api的路径是其他的子串的场景:即当我的数组具有如下条目时
api 1:path =“/ asset /”
api 2:path =“/ assset / scheme /”
答案 0 :(得分:0)
var arr = [[2,4],'ciao',4,true];
ns() {
return this.arr;
}
您正在进行字符串比较,因此不适用于所有情况(因为路径,查询参数更改)。
所以我的建议是比较if(apiArray[i].path=== reqPath).
:
baseurl不会改变,所以你可以进行字符串比较。
BASE URL
您使用的是Express吗?如果是,则使用快速模块处理。
答案 1 :(得分:0)
首先npm install --save lodash
案例1: 如果你不能编辑路径密钥添加一个包含常规表达式的新密钥,否则编辑apiArray []的所有对象的路径的路径密钥 例如:
"path" : new RegExp("/auth/logout/*";
然后使用lodash库快速找到匹配的对象;
var _ = require('lodash');
var apiArray = [
{
"api": "login",
"path": new RegExp("/auth/login"),
"method": "POST"
},
{
"api": "logout",
"path": new RegExp("/auth/logout/*"),
"method": "POST"
},
{
"api": "getAsset",
"path": new RegExp("/asset/*"),
"method": "GET"
},
{
"api": "getAssetScheme",
"path": new RegExp("/asset/Scheme/*"),
"method": "GET"
}
];
var url = '/asset/frew'
var api = _.find(apiArray, function(item){
return item.path.test(url);
});
console.log(api);
这将返回包含匹配路径的对象,您可以从中提取api
案例2:
将reqPath拆分为&#39;?&#39;并将网址提供给上述查找功能
const reqPath ="/tree/getTree/?subTree=true&&type=node";
const url = reqPath.split('?')[0];