koa --- > 自定义路由读取规则
程序员文章站
2024-03-14 15:17:28
...
实现MVC分层架构
- 目标是创建约定大于配置、开发效率高、可维护性强的项目架构
- 路由处理
- 规范
- 所有路由,都要放在routes文件夹中
- 若导出路由对象,使用 动词+空格+路径 作为key, 值是操作方法
- 若导出函数, 则函数返回第二条约定格式的对象
- 路由定义:
- 新建
router/index.js
, 默认index.js
没有前缀
module.exports = { 'get /':async ctx => { ctx.body = '首页' }, 'get /detail': ctx => { ctx.body = '详情页面' } }
- 新建
router/user.js
路由前缀是/user
module.exports = { 'get /': async ctx => { ctx.body = '用户首页' }, 'get /detail': async ctx => { ctx.body = '用户详情页面' }
- 新建
- 规范
}
````
新建目录结构如下
/mar/mar-load.js
-
load
函数,根据传入的参数(‘routes’),读取目录及其内容,将得到参数该回调函数 - 说明:
-
__dirname
: 保存的是当前文件夹的路径 -
fs.readdirSync
: 同步获取当前文件夹下的文件 -
require(filename)
: 获取文件夹中的内容
const path = require('path');
const fs= require('fs');
const load = async (dir, cb) =>{
// 获取dir的路径
const url = path.resolve(__dirname, dir);
// 获取dir文件夹下的文件内容
const files = fs.readdirSync(url);
// 遍历文件
files.forEach((filename) =>{
// 去掉扩展模
filename = filename.replace('.js', '');
const routes= require(`${url}/${filename}`);
cb(filename, routes);
})
}
-
initRouter
函数:
- 使用
koa-router
将路由和路由处理函数关联起来 - 根据
load
函数传来的函数名,添加路由前缀
const Router = require('koa-router');
const initRouter = () =>{
const router = new Router();
load("routes", (filename, routes) =>{
const prefix = filename === 'index' ? '' : '${filename}';
Object.keys(routes).forEach( key =>{
const [ method, path ] = key.split(' ');
// 注册路由
router[method](prefix + '/' + path, routes[key]);
})
})
return router
}
- 总体代码如下
/mar/mar-load.js
const fs = require('fs');
const path = require('path');
const Router = require('koa-router');
// 读取目录和路径
const load = async (dir, cb) => {
// 获取绝对路径
const url = path.resolve(__dirname, dir);
// 读取目录
const files = fs.readdirSync(url);
files.forEach((filename) => {
// 去掉扩展名
filename = filename.replace('.js', '');
const routes = require(url + '/' + filename);
cb(filename, routes);
})
}
// 加载路由
// app.get('/', ctx => {})
const initRouter = () => {
const router = new Router();
load('routes', (filename, routes) => {
const prefix = filename === 'index' ? '' : `/${filename}`;
Object.keys(routes).forEach(key => {
const [method, path] = key.split(' ');
console.log(`正在映射地址: ${method.toLocaleUpperCase()}${prefix}${path}`);
// 注册路由
router[method](prefix + path, routes[key]);
})
})
return router;
}
module.exports = { initRouter }
初始化文件
-
/mar/index.js
: 为初始文件,负责工作如下:
- 加载mar-load.js,并执行.
- 创建一个http服务器监听3000端口
const koa = require('koa');
const app = new koa();
const { initRouter } = require('./mar-load');
app.use(initRouter().routes());
app.listen(3000);