区分不同的网址

时间:2016-09-26 01:15:35

标签: javascript regex node.js routing

我试图区分不同的网址。我有一个if / else,但希望这可以在vanilla js中做得更好。请不要快递。

/product
/product/1 
/product/1/customer

/product
/product/2
/product/2/customer


/customer
/customer/1
/customer/1/product

/customer
/customer/2
/customer/2/product

目前的策略:

if(request.url.indexOf('/product') != -1 && request.url.length == '/product'.length) {

} else if { // /product/:id
     if(!request.params) request.params = {};
    request.params.id = request.url.match(/^\/product\/([^\\/]+?)(?:\/(?=$))?$/i)[1];
} else { // 3rd case /product/1/customer

}

我认为我的if / else并没有解决上面提到的所有uri。请提出任何解决方案,以便我可以通过可重复使用的方式解决上述所有3个案例的不同网址,并从那里运行相应的查询。

1 个答案:

答案 0 :(得分:0)

这是一个非常基本的例子,希望能让你走上正轨。您首先需要存储所需的所有URL以及要运行的相关功能。然后,当有新网址进入时,您需要将其与存储的网址进行比较,以查看是否存在匹配项。由于网址可能具有某些不同的值,因此您需要一种处理通配符的方法。

首先创建一个函数,将一个特定的url方案和相关的run函数添加到一个数组中。

var myUrls = [];
function addUrl(url, associatedFunc){

    mrUrls.push({
        func: associatedFunc,
        parts: url.split('/').map(function(item){
            return item.startsWith(':') ? null : item;
        });
    });
}

要添加新网址,您可以将:放在网址的任何部分前面,这可能是狂野的。

addUlr('/product/:value/customer', doCustomerStuffFunc);

接下来,您需要一种将传入的网址请求与您的网址数组进行比较的方法。

function resolveUrl(url){

    myUrls.forEach(function(item){
        var pieces = url.split('/');
        if(pieces.length === item.parts.length){
            for(var i=0; i<pieces.length; i++){
                // check if the piece is valid
                if(item.parts[i] && pieces[i] !== item.parts[i]){
                    break;
                }

                // if there is an exact match run the function and return
                if(i === pieces.length - 1){ return item.func(pieces); }
            }
        }
    });
}

这将运行第一个遇到匹配的匹配函数,传入一个包含给定url中所有值的数组。

注意:这是未经测试的代码,写在我的头顶,旨在帮助您入门,而不是一个完整的解决方案。