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_loginmkdir -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;
- 新建一个路由文件