express/koa下的router,缺少依賴注入(配置)的環(huán)節(jié),要么另起一個routerconfig,在routerconfig中描述所有的指向關(guān)系,如
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
實現(xiàn)描述
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) {
//添加類靜態(tài)屬性
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.獲取結(jié)構(gòu)的關(guān)系信息
var configMapping = routerConfig.mapping;
_.each(Object.getOwnPropertyNames(routerConfig.prototype), (methodName) => {
//2.不為構(gòu)造函數(shù),即為路由函數(shù)
if (methodName != 'constructor') {
//3.1獲取具體路由執(zhí)行函數(shù)
var methodFn = routerConfig.prototype[methodName];
//3.2獲取路由結(jié)構(gòu)屬性
var {
url,
method
} = configMapping[methodName];
router[method](url, methodFn);
}
})
//4.注入到總路由中
allrouter.use(routerConfig.url, router.routes(), router.allowedMethods());
})
export default allrouter;
最終實現(xiàn)
總結(jié)
還是不太好用
還不如根據(jù)名字自動生成配置文件,配置就配置吧