koa下的router

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ù)名字自動生成配置文件,配置就配置吧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容