Nodejs数组匹配

时间:2016-04-13 05:08:51

标签: arrays node.js

我有一个包含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 /”

2 个答案:

答案 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];