node 讀取文件目錄實現去中心化管理路由node
最近寫node項目發現路由太多,手動require不符合程序員的氣質。爲了偷懶只能寫一段代碼自動導入了。程序員
│─app.js // 入口文件
│─router // 路由文件夾
│ │─router.js // 路由集中
│ ├─V1 //版本文件
│ │ └─test.js // 路由
│ └─V2
│ └─test.js
│─utils
└─requireContext.js // 工具函數
複製代碼
// app.js 代碼
const Koa = require('koa')
const routes = require('./router/router.js')
const app = new Koa()
// 掛載路由
app.use(routes)
app.listen(3000)
複製代碼
// router/router.js 做爲路由的集中地
const path = require('path')
const compose = require('koa-compose')
const requireContext = require('../utils/requireContext.js')
// 原來的寫法
/* const routes = compose([ //須要將全部的路由導入進來 require('./V1/test.js').routes(), require('./V1/test.js').routes(), ]) */
//如今的寫法 新曾路由文件不再用手動導入了
// 參數1 文件路徑
// 參數2 正則 這裏是 不是router.js結尾的全部js
// 參數3 遞歸子目錄
let files = requireContext(path.resolve(__dirname, './'), /(?<!router)\.js$/, true) console.log(files); const routes = compose(files.map(item => require(item).routes())) // 導出路由中間件集合 module.exports = routes 複製代碼
// router/V1/test.js router/V2/test.js
const Router = require('koa-router')
const router = new Router()
router.prefix('/V2')
router.get('/test', (ctx, next) => {
ctx.body = 'hello'
})
// 導出路由
module.exports = router
複製代碼
// 文件加載去中心化
const fs = require('fs')
const path = require('path')
/** * @param {String} filePath 目錄絕對路徑 * @param {Regexp} filters 過濾器 * @param {Boolean} deep 是否遍歷子目錄 * @returns {Array} */
function requireContext(filePath, filters, deep) {
// 文件直接退出
if (fs.statSync(filePath).isFile()) {
return [filePath]
}
// 過濾器不是正則
if (filters && !(filters instanceof RegExp)) {
throw new Error('filters must Regexp')
}
let filesArray = []
findFile(filePath, deep, filesArray)
return filters ? filesArray.filter(item => filters.test(item)) : filesArray
}
function findFile(filePath, deep, filesArray) {
let files = fs.readdirSync(filePath)
files.forEach(item => {
let fPath = path.resolve(filePath, item)
if (fs.statSync(fPath).isFile()) {
filesArray.push(fPath)
} else if (deep) {
findFile(fPath, deep, filesArray)
}
})
}
module.exports = requireContext
複製代碼