侧边栏壁纸
博主头像
woku博主等级

学可以无术,但不能不博。 术可以无量,但不能不专。

  • 累计撰写 5 篇文章
  • 累计创建 11 个标签
  • 累计收到 2 条评论

koa-router路由自动加载

woku
2022-12-28 / 0 评论 / 0 点赞 / 52 阅读 / 469 字

手动加载路由

在koa2的爬虫后端项目中,我们会对路由模块就行拆分。然后在app.js中进行导入和路由注册。

const crawlerRouter = require("./routes/crawler");
const indexRouter = require("./routes/index");
const adminRouter = require("./routes/admin");
//.....
app.use(crawlerRouter.routes(), crawlerRouter.allowedMethods());
app.use(indexRouter.routes(), indexRouter.allowedMethods());
app.use(adminRouter.routes(), adminRouter.allowedMethods());

这种是手动导入和手动进行注册的方式

require-directory自动加载路由

自动的导入路由和统一的路由注册

路由模块统一放到routers文件夹下,我们需要导入routers文件夹下的所有**模块**
思路就是一个个手动导入 -> routers里面的模块全部自动的一个个导入。

  • 安装
npm install require-directory
  • 导入
const Router = require('koa-router')
const requireDirectory = require('require-directory')
const requireDirectory = require('require-directory')
const allRouters = requireDirectory(module, './routers, {
                      visit: whenModuleLoad
                    }) 
 function whenModuleLoad(obj) {
       // 判断导出的是一个路由实例,才进行注册
       if (obj instanceof Router) {
           app.use(obj.routes())
       }
 }

requireDirectory:
第一个参数:module 表示导入的是模块
第二个参数:要导入哪个文件夹下的模块
第三个参数:每导入一个模块后要执行的回调函数(路由注册)

初始化管理器

我们可以把初始化的相关逻辑都放在core/init.js文件中

const Router = require('koa-router')
const requireDirectory = require('require-directory')
class InitManager {
    static initCore(app) {
        InitManager.initRouters(app)
    }
    static initRouters(app) {
        const routerDirectory = `${process.cwd()}/routers`
        requireDirectory(module, routerDirectory, {
            visit: whenModuleLoad
        })
        function whenModuleLoad(obj) {
          if (obj instanceof Router) {
              app.use(obj.routes())
          }
        }
    }
}
module.exports = InitManager

process.cwd()返回项目的根目录。
routerDirectory的第二个参数,我们的目录层级有变化,需要使用绝对路径。来保证不管写在哪里,我们都是导入的routers文件下的所有目录。他的绝对路径不会发生变化

0

评论区