关于路由

最后更新于:2022-04-02 05:34:11

## 前言 本文主要介绍关于koa-router部分的一些方便快捷的方法,可以提高整体项目的开发效率。 ## 自动注册路由 该方法主要是自动检测控制层部分的代码文件,然后自动检测其支持的方法,写入路由中,再让app配置使用注册好的路由。 ~~~ MainApp.prototype.registerRoute = function(app, controllerDir){ var me = this; var routePath = ""; traverse(controllerDir, '', function(file) { try { if (path.extname(file) != '.js') { console.warn('Ingore non-js controller file:' + file); return; } var aController = require(path.join(controllerDir, file)); } catch (e) { console.error('Fail to load controller %s.', file, e.stack); return; } var controllerPath = file.substr(0, file.lastIndexOf('Controller')); var actionArr = getAction(aController); actionArr.forEach(function (ele) { var method = ele.method; var action = ele.action; routePath = controllerPath + '/' + action; if (action == 'index') { Router[method](controllerPath + '/', aController[method + '_' + action]); if (controllerPath == "/home") { Router[method]('/', aController[method + '_' + action]); } } Router[method](routePath, aController[method + '_' + action]); console.log('Registering directory controller %s\t%s', method, chalk.cyan(routePath)); //routerStacks.push(router); }); }); me.app .use(Router.routes()) .use(Router.allowedMethods()); me.boot(); }; ~~~ ~~~ //解析控制层中的方法,需要保证方法的标准格式 function getAction(controller){ var propertyArr = Object.getOwnPropertyNames(controller.__proto__); var re=/(get_)|(post_)|(delete_)|(put_)/i; var actionArr = []; var method = ''; var action = ''; propertyArr.forEach(function(propertyName){ if(re.test(propertyName) && (typeof controller[propertyName] == 'function')){ method = propertyName.split('_')[0]; action = propertyName.split('_')[1]; actionArr.push({ "method": method, "action": action }); } }) return actionArr; } ~~~ ## 拦截器 拦截的页面目录自行配置,写成一个模块文件。中间件中检测过滤页面中是否包含当前的页面地址,如果包含进行判断重定向的逻辑。 ~~~ //定义业务拦截目录 module.exports = [ '/mc/profile', '/mc/list', '/mc/detail', '/mc/tasks', '/mc/homework', '/mc/errorbook', '/mc/picnote', '/member/profile', '/member/profileModifyData', '/member/modifyPhoneData', '/member/modifyPasswordData', '/mc/weekreport'] //中间件做拦截判断 if (filterList.includes(linkUrl)) {} ~~~ ## 其他
';