KOA2项目脚手架优化

参考了一些项目结构,对之前从用KOA2开发的项目www.mofish.online 提取出来的脚手架进行了一下改造。Github上有很多Koa2的脚手架,大多数都差不多,相比如Think.jsEgg.js这些封装得很完整的框架这些脚手架适用于一些比较简单的项目,当然可以一开始就使用Think.js或者Egg.js来开发项目,但是经常折腾一下还是有好处的

脚手架项目地址:github.com/mrtanweijie…

1、Controller改造

router单独提取到独立的文件,Controller只保留业务逻辑相关的代码

改造前的Controller

import ApiError from '../error/ApiError'
import ApiErrorNames from '../error/ApiErrorNames'

export default async router => {
  router.get('/api/userInfo/:id', userInfo).get('/api/userList', userList)
}
async function userInfo (ctx, next) {
  if (Number(ctx.params.id) !== 1) {
    throw new ApiError(ApiErrorNames.USER_NOT_EXIST)
  }
  ctx.body = { id: 1, name: 'twj', age: 18 }
}

async function userList (ctx, next) {
  ctx.body = [{ name: 'twj0', age: 18 }, { name: 'twj1', age: 19 }]
  await next()
}

复制代码

改造后的Controller

import ApiError from '../error/ApiError'
import ApiErrorNames from '../error/ApiErrorNames'
class UserController {
  async userInfo (ctx, next) {
    if (Number(ctx.params.id) !== 1) {
      throw new ApiError(ApiErrorNames.USER_NOT_EXIST)
    }
    ctx.body = { id: 1, name: 'twj', age: 18 }
  }

  async userList (ctx, next) {
    ctx.body = [{ name: 'twj0', age: 18 }, { name: 'twj1', age: 19 }]
    await next()
  }
}
export default new UserController()
复制代码

userRouter

import userController from '../controllers/UserController'
export default async router => {
  router
    .get('/api/userInfo/:id', userController.userInfo)
    .get('/api/userList', userController.userList)
}
复制代码
2、Router优化

之前每新建一个router都需要手动到index.js里面添加一个initXXX进行手动初始化

import initUser from './user.js'
export default router => {
  initUser(router)
}
复制代码

router单独提取之后就可以统一读取注入了

import routesLoader from '../utils/routesLoader'
export default router => {
  routesLoader(`${__dirname}`).then(routersList => {
    console.log('initRouter')
    routersList.forEach(initRouter => {
      initRouter.default(router)
    })
  })
}
复制代码

routesLoader通过使用glob模块来读取routes文件夹下的所有路由配置,然后自动初始化路由。routesLoader实现:

import glob from 'glob'

export default function (dirname) {
  return new Promise((resolve, reject) => {
    const routers = []
    glob(`${dirname}/*`, { ignore: '**/index.js' }, (err, files) => {
      if (err) {
        reject(err)
      }
      files.forEach(file => {
        const router = require(file)
        routers.push(router)
      })
      resolve(routers)
    })
  })
}
复制代码

这样就基本改造完成啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值