首页 > 解决方案 > NodeJS,如何编写正则表达式以动态路由路径

问题描述

我正在编写一个使用 JSON 对象作为清单的路由器。路由器使用 JSON 清单作为路由传入请求的 url 路径的参考。下面的代码属于使用 node 命令运行以启动应用程序的 main.js。在文档顶部附近,您可以看到将 JSON 清单作为参数的路由器对象。在这段代码下方,是另一段代码,它显示了路由器类写入其中的路由器文档,您可以在那里看到我如何尝试使用此 JSON Manifest 路由请求。


const app = require('./serv/katanaLib');

const Router = require('./serv/router');

var router = new Router.Router({
    "^/(.*)$"         :   "/public/view/page/:[?]",
    "^/user/(.*)$"   :   "/public/view/account/:[?]",
    "^/style/(.*)$"   :   "/public/style/:[?]"
});

app.Server(8888, function(request, response)
{
    const $_Request = app.parseHttpReq(request);

    router.onReq($_Request);
});


module.exports.Router = class Router
{
    constructor(JSON_manifest)
    {
        this.manifest = JSON_manifest;
        this.keys = Object.keys(JSON_manifest);
        this.values = Object.values(JSON_manifest);
    };

    onReq($_Request)
    {
        this.keys.forEach((key, i)=>
        {
            key = ('^' + key + '$');

            var re = new RegExp(key, 'i');            
            let x = $_Request.path.search(re);

            console.log('\n\n' + key);
            console.log(re);
            console.log(x + '\n\n');
        });

    };
};


任何人都可以清楚地看到,我正在将正则表达式写入 JSON 清单对象的键中。您可以看到我使用 foreach 循环搜索请求的路径,遍历每个清单键。我遇到的问题是我的正则表达式值匹配多次。当我运行上面的代码并向我的服务器发出以下请求时。

Request Recieved:

Parsed-Request:
{ path: '/index', method: 'GET', ext: '', type: 'text/html' }


^^/(.*)$$
/^^\/(.*)$$/i
0

^^/user/(.*)$$
/^^\/user\/(.*)$$/i
-1


^^/style/(.*)$$
/^^\/style\/(.*)$$/i
-1

这是一个理想的结果,但是当我运行时:

我明白了……

Parsed-Request:
{ path: '/user/abc', method: 'GET', ext: '', type: 'text/html' }

^^/(.*)$$
/^^\/(.*)$$/i
0

^^/user/(.*)$$
/^^\/user\/(.*)$$/i
0


^^/style/(.*)$$
/^^\/style\/(.*)$$/i
-1

正则表达式匹配第一个和第二个,这是不可取的。如果我请求http://localhost/style/123请求的路径将匹配第一个键和第三个键。如果有人对如何编写正则表达式有建议,那么我可以完成这个,那就太好了,谢谢...

标签: node.jsregex

解决方案


要解决多个正则表达式匹配的问题,最好按特定顺序测试它们,从最具体到最不具体。然后,将使用第一个匹配项。

在您的示例中,正则表达式作为对象键提供。由于对象键是无序的,因此您需要使用数组来控制正则表达式的顺序。

在这种情况下,正则表达式的顺序如下(第一个和第二个可以交换):

  • ^/用户/(.*)$
  • ^/样式/(.*)$
  • ^/(.*)$

推荐阅读