koa中使用require-directory实现路由自动注册
-
第一步:导入依赖,使用npm导入koa、koa-router、require-directory
-
第二步:在主程序中加入路由自动注册的代码
const Koa = require("koa"); const requireDirectory = require("require-directory"); const Router = require("koa-router"); const app = new Koa(); // 第一个参数固定是module,第二个参数是要注册的router的相对路径,第三个参数是注册每个路由之前执行的业务代码 requireDirectory(module, "./api/v1", { visit: (obj) => { // 判断当前对象是否是一个Router,这种判断方式很简单,只适用于导出时没有使用大括号的方式,如果使用了大括号,这里的判断逻辑相对就会复杂一些 if(obj instanceof Router) { app.use(obj.routes()); } } })
-
第三步:编写路由
路由必须放在
/api/v1
路径下,否则路由就不能自动注册const Router = require("koa-router"); const router = new Router(); router.get("/v1/book/laster", (ctx, next) => { ctx.body = {key: ctx.path}; }) // 这里导出时不能使用花括号,否则第二步的自动注册中的路由判断逻辑就要改 module.exports = router;
代码优化
实现代码的分离,将主程序中的路由自动注册部分的代码抽取到初始化方法中
-
新建文件core/init.js
// init.js const requireDirectory = require("require-directory"); const Router = require("koa-router"); class InitManager { // app; // 这种写法在node.js中是错误的 // 统一初始化方法 static init(app) { // node.js中不支持在类中加属性的写法 InitManager.app = app; InitManager.initLoadRouters(); } // 路由自动注册 static initLoadRouters() { // 获取api目录的绝对路径 const apiDirectory = `${process.cwd()}/api` requireDirectory(module, apiDirectory, { visit: (obj) => { if(obj instanceof Router) { InitManager.app.use(obj.routes()); } } }) } } module.exports = InitManager
-
主程序调用
// app.js const Koa = require("koa"); const InitManager = require("./core/init"); const app = new Koa(); InitManager.init(app);