欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 = '用户详情页面'
      }
      

}
````

新建目录结构如下

koa --- > 自定义路由读取规则

/mar/mar-load.js

  • load函数,根据传入的参数(‘routes’),读取目录及其内容,将得到参数该回调函数
  • 说明:
  1. __dirname: 保存的是当前文件夹的路径
  2. fs.readdirSync: 同步获取当前文件夹下的文件
  3. 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函数:
  1. 使用koa-router将路由和路由处理函数关联起来
  2. 根据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: 为初始文件,负责工作如下:
  1. 加载mar-load.js,并执行.
  2. 创建一个http服务器监听3000端口
const koa = require('koa');
const app = new koa();
const { initRouter } = require('./mar-load');
app.use(initRouter().routes());
app.listen(3000);