koa下的router

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;

最终实现

总结

还是不太好用

还不如根据名字自动生成配置文件,配置就配置吧

你可能感兴趣的:(koa下的router)