Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

setRouter处理所有路由

import os from "os";
import fs from "fs";
import path from "path";
const __dirname = path.resolve();

import { Log } from "../utils/api_log.js";
const log = new Log("setRouter");

const setRouter = async (app, relative_path) => {
    log.info("middleware set router in directory", null, { relative_path });
    const platformName = os.platform().toString();
    const base_path = path.join(__dirname, relative_path);
    const files = fs.readdirSync(base_path);

    for (let file of files){
        log.info("set router", null, { file });
        const file_path_prefix = platformName.startsWith("win") ? "file://" : "";
        let module = await import(file_path_prefix + path.join(base_path, file));
        let router = module.default;
        app.use(router.routes()).use(router.allowedMethods())
    }
}

export default setRouter;
  • 作用

    • 把指定相对目录下的所有路由文件,自动import进去并注册
  • 这里要注意

    • 必须要写成async异步函数
    • 必须要用for,而不能用forEach(因为它不支持异步等待)
    • 必须要await import
      • 这里import返回一个Promise
      • 只要await,就能得到module对象
      • 对象内有default,就是我们默认导出的router

前提:需要新建两个文件夹,放置多个路由文件

  • 在根目录下,新建两个目录

    mkdir -p ./lib/router/v1/no_login
    
    mkdir -p ./lib/router/v1/need_auth
    
  • 进入其中一个目录

    cd ./lib/router/v1/no_login
    
    • 新建一个路由文件
      touch index.js
      
    • 内容为
      import KoaRouter from "koa-router";
      const router = new KoaRouter();
      
      router.get("/", async ctx => {
          ctx.body = "index";
      })
      
      export default router;