我正在创建一个可重用的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);现在,这和控制器被正确地调用了。基于getRouteByPath(path).调用适当控制器对象的导航(req,res)函数被定义为名为的函数。这个私有函数将获得路由,并允许导航(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;
};我太担心这个功能了,好像这是正确的方式吗?
发布于 2012-07-18 15:02:04
一些缺陷:
[/])?不需要这样做,只是在regex文本中,您需要用反斜杠(如/\//g)来转义它。只需使用单个"/“(new RegExp("/", "g"))即可。.indexOf(<string>)==0确实工作,但是搜索整个字符串,效率不高。最好使用起家,在您的例子中是routePart.charAt(0)==":"<string>.match(<string>) -我建议构建一个新的对象并使用.test,因为您不想匹配--我认为也不需要构建捕获组,因为您只返回路由字符串,而不返回匹配(好的,您记录它们)。path是否与您的regexp匹配吗?别忘了添加^和$。您当前对AppController的正则表达式还匹配像/user/app/example这样的路由。/?)?不仅我不认为这是您想要的,而且在构建像灾难性回溯这样的正则表达式时,它也为/\/?user\/?([A-Za-z0-9]*)\/?([A-Za-z0-9]*)/打开了大门
要避免这种情况,需要将整个组设置为可选的:(?:/([^/]*))?。getRouteByPath时都构建它们。RegExp的编译隐藏在您的代码中,尽管它需要进行。发布于 2012-07-18 15:03:23
几个注意事项:
routeRegex += '[/]?([A-Za-z0-9]*)';表示路由可能存在也可能不存在,//将与之匹配,也许+比*更适合。
另外,由于我在web路由中允许使用瘦_。
您的.split('/')将从路由中删除所有/,因此不应该在拆分列表中
https://stackoverflow.com/questions/11544134
复制相似问题