美文网首页
koa下的router

koa下的router

作者: 刘程源 | 来源:发表于2018-12-26 19:17 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/kwrklqtx.html