express/koa下的router,缺少依赖注入(配置)的环节,要么另起一个routerconfig,在routerconfig中描述所有的指向关系,如
router
.get('/user',getUser)
.post('/user',require('./user/saveUser').default)
有点ssh1的意思
另一种方式就是参考springmvc的格式,使用注解去掉配置
参考格式
使用方式
import {
Get,
Post,
Put,
Delete,
Router
} from '@/common/Router'
@Router('/user')
class User {
@Get("/")
async getAll(ctx, next) {
return {
list: await M.user.find()
}
}
@Get("/:id")
async getById(ctx, next) {
return {
a: 1
}
}
}
export default User
实现描述
import _ from 'lodash'
import RouterMethod from './RouterMethod'
export default _.flow([(url) => {
return {
url,
method: 'get'
}
}, RouterMethod]);
get/post等系列,最终在RouterMethod
//加载url与method
export default function RouterMethod(config) {
return function(target, methodName) {
var constructor = target.constructor;
if (!constructor.mapping) {
//添加类静态属性
Object.defineProperty(constructor, 'mapping', {
enumerable: false,
value: {}
});
}
constructor.mapping[methodName] = config;
}
}
对对象追加mapping属性,用来辅助描述url
//只会为类
export default function Router(config) {
if (_.isString(config)) {
config = {
url: config
}
}
return function(target) {
Object.assign(target, config);
}
}
Router中添加router的配置地址
import KoaRouter from 'koa-router'
import _ from 'lodash'
import config from './config'
const allrouter = KoaRouter();
_.each(config.list, (routerConfig) => {
var router = KoaRouter();
//1.获取结构的关系信息
var configMapping = routerConfig.mapping;
_.each(Object.getOwnPropertyNames(routerConfig.prototype), (methodName) => {
//2.不为构造函数,即为路由函数
if (methodName != 'constructor') {
//3.1获取具体路由执行函数
var methodFn = routerConfig.prototype[methodName];
//3.2获取路由结构属性
var {
url,
method
} = configMapping[methodName];
router[method](url, methodFn);
}
})
//4.注入到总路由中
allrouter.use(routerConfig.url, router.routes(), router.allowedMethods());
})
export default allrouter;
最终实现
总结
还是不太好用
还不如根据名字自动生成配置文件,配置就配置吧