Nodejs数组匹配



我有一个数组,其中包含如下路径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模块进行处理。

最新更新