/* * @Description: 框架服务路由模块 * @version: 1.0.0 * @Company: saganlab * @Author: vcbear * @Date: 2022-08-24 19:01:06 * @LastEditors: vcbear * @LastEditTime: 2022-09-01 16:33:52 */ import glob from 'glob'; import path from 'path'; import compose from 'koa-compose'; export default async (app) => { const { router } = app.config; console.log("router type: " + router); // 如果是文件路由类型 if (router === 'file') { let routerMap = {}; // 定义文件路由映射表 // 读取项目controller目录下文件结构,用于文件路由模式下路由请求匹配 //const filesList = glob.sync(path.resolve(app.appPath, './controller', `**/*${app.extName}`)) // linux平台 const filesList = glob.sync(`**/*${app.extName}`, {cwd: path.resolve(app.appPath, './controller')}) // windows平台 for (let item of filesList) { // 解构的方式获取,当前文件导出对象中的method属性和handler属性 const controller = await import(item); const { method, handler } = controller.default; // 获取和controller目录的相对路径,例如:goods/getInfo.js let relative = path.relative(`${app.appPath}/controller/`, item) // 获取当前操作系统的标识, windows:'win32', MacOS: 'darwin' const platform = process.platform; // 如果是windows系统: goods\getInfo.js => goods/getInfo.js platform === 'win32' ? (relative = relative.replace(/\\/g, '/')) : ''; // 获取文件后缀.js const extname = path.extname(item) // 剔除后缀.js,并在最前面加一个"/",例如:/goods/getInfo const fileRouter = '/' + relative.split(extname)[0] // 连接method,形成一个唯一请求,例如: _GET_/goods/getInfo const key = '_' + method + '_' + fileRouter // 保存在路由表里 routerMap[key] = handler } app.use(async (ctx, next) => { const { path, method } = ctx // 构建和文件路由匹配的形式:_GET_路由 const key = '_' + method + '_' + path // 如果匹配到,就执行对应到handler if (routerMap[key]) { await routerMap[key](ctx) } else { await ctx.render('404') //ctx.body = 'no this router' } return next() }) } else { // 如果是 koa-router 类型 // 读取项目routers目录下路由模块,用于koa-router路由模式下路由请求匹配 //const routerFiles = glob.sync(path.resolve(app.appPath, './routers', `**/*${app.extName}`)); // linux平台 const routerFiles = glob.sync(`**/*${app.extName}`, {cwd: path.resolve(app.appPath, './routers')}) // windows平台 const registerRouter = async () => { let routers: any[] = []; for (let file of routerFiles) { // 解构获取当前路由模块的路由属性 //console.log(file); const router = await import(path.resolve(app.appPath, './routers',file)); // 加入路由表里 routers.push(router.default.routes()); } return compose(routers) } app.use(await registerRouter()) app.use(async (ctx, next) => { try{ await next(); // 执行后代的代码 if(!ctx.body){ // 没有资源 await ctx.render('404') } }catch(e){ // 如果后面的代码报错 返回500 await ctx.render('500') } }) } }