我有一个数组,其中包含如下路径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.具有路径参数的api:例如logout、getAsset,它们具有路径参数(分别为sessionId和Id)。在这种情况下,
reqPath="/auth/logolog/55ffc09e56eb79c737c7aac6"
2.带有查询参数的api:此处,
reqPath="/tree/getTree/?子树=true&type=node"
如何修改函数"getApiName"以支持带有查询和路径参数的api?
此外,我可能必须支持这样一种场景,其中一个api的路径是另一个的子字符串:即,当我的数组具有如下条目时
api 1:path="/asset/"
api 2:path="/asset/scheme/"
第一个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并将url馈送到上述查找功能
const reqPath ="/tree/getTree/?subTree=true&&type=node";
const url = reqPath.split('?')[0];
if(apiArray[i].path=== reqPath).
您正在进行字符串比较,因此不适用于所有情况(随着路径、查询参数的更改)。
所以我的建议是比较BASE URL
:
baseurl不会更改,因此您可以进行字符串比较。
var apiArray=[
{
"api" : "login",
"path" : "/auth/login",
"baseurl":"/auth/login"
"method" : "POST"
},
{
"api" : "logout",
"path" : "/auth/logout/{sessionId}",
"baseurl":"/auth/logout/"
"method" : "POST"
}]
function getApiName(apiArray, reqbaseurl){
// 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].baseurl=== reqbaseurl) return apiArray[i].api;
}
return null;
}
你在用快车吗?。如果是,则使用express模块进行处理。