关于路由
最后更新于: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)) {}
~~~
## 其他
';