0

我正在创建一个可重用的 node.js NavigationController类,因此我可以在其他服务器端项目中重用它,如果我可能需要或其他人可能会发现它有用。

这是用例。

var navController = new NavigationController({
    routes : {
        '/user/:action/:anything' : 'UserController',
        '/app/:action' : 'AppController',
        '/file/:action' : 'FileController',
        '/feedback/:action' : 'FeedbackController',
        '/:anything' : 'ErrorController'
    },
    ErrorController : 'ErrorController'
});
navController.init();

服务器请求的用户可以调用该对象的这个函数。

navController.navigate(req, res);

现在这个和控制器被正确地调用了。作为基于 URL 调用适当控制器对象的一部分的navigate(req, res)函数下的东西被定义为名为getRouteByPath(path)的函数。此私有函数将获取路由并允许navigate(req, res)函数获取要调用的控制器类名称。

var getRouteByPath = function(path) {
    for(var route in config.routes) {
        var routeRegex = '';

        var routeParts = route.split('/');

        for(var rp = 0; rp < routeParts.length; rp++) {

            // checking if route part starts with :
            if(routeParts[rp].indexOf(':') === 0) {

                // this is "anything" part
                routeRegex += '[/]?([A-Za-z0-9]*)';

            } else if(routeParts[rp] != "") {
                routeRegex += '[/]?' + routeParts[rp];
            }
        }

        var routeRegexResult = path.match(routeRegex);
        if(routeRegexResult) {
            console.log(routeRegexResult);
            return route;
        }
    }
    return null;
};

我太担心这个功能,好像这是正确的方法?

4

2 回答 2

2

一些缺陷:

  • 为什么使用斜杠作为字符类([/])?无需这样做,仅在正则表达式文字中,您需要使用反斜杠(如/\//g)对其进行转义。只需使用单个“ /”代替(new RegExp("/", "g"))。

  • .indexOf(<string>)==0确实有效,但搜索整个字符串并且效率不高。在您的情况下,更好地使用startswithroutePart.charAt(0)==":"

  • <string>.match(<string>)- 我建议构建一个新RegExp对象并使用.test,因为你不想匹配- 我认为也不需要构建捕获组,因为你只返回路由字符串但没有匹配(好的,你记录它们)。

  • 您想检查整个是否path与您的正则表达式匹配?不要忘记添加^$。您当前的 AppController 正则表达式也匹配类似/user/app/example.

  • 为什么你的斜线(并且只有斜线)是可选的(/?)?不仅我认为这不是您想要的,而且在构建正则表达式时,它也为灾难性回溯打开了大门/\/?user\/?([A-Za-z0-9]*)\/?([A-Za-z0-9]*)/

    为了避免这种情况,您需要将整个组设为可选:(?:/([^/]*))?.

  • 此外,您应该只构建一次正则表达式(在初始化时)并将它们存储在缓存中,而不是每次调用getRouteByPath. 的编译RegExp隐藏在您的代码中,尽管它需要发生。

于 2012-07-18T15:02:04.120 回答
0

几点注意事项:

routeRegex += '[/]?([A-Za-z0-9]*)';

表示可能存在或不存在的路线//将匹配可能 a+比 a 更适合*

_此外,由于网络路由允许我瘦

您的.split('/'), 将从路线中删除所有/内容,因此它不应该在拆分列表中

于 2012-07-18T15:03:23.577 回答