参考了一些项目结构,对之前从用KOA2开发的项目www.mofish.online 提取出来的脚手架进行了一下改造。Github上有很多Koa2的脚手架,大多数都差不多,相比如
Think.js
、Egg.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)
})
})
}
复制代码
这样就基本改造完成啦