专栏首页randomnode路由去中心化

node路由去中心化

简介

node 读取文件目录实现去中心化管理路由

背景

最近写node项目发现路由太多,手动require不符合程序员的气质。为了偷懒只能写一段代码自动导入了。

目录结构

│─app.js // 入口文件
│─router  // 路由文件夹
│    │─router.js  // 路由集中
│    ├─V1   //版本文件
│    │ └─test.js  // 路由
│    └─V2
│       └─test.js
│─utils
    └─requireContext.js // 工具函数

app.js

    // app.js 代码
    const Koa = require('koa')
    const routes = require('./router/router.js')
    const app = new Koa()
    // 挂载路由
    app.use(routes)
    app.listen(3000)

router.js

    // 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

test.js

    // 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

requireContext.js

    // 文件加载去中心化
    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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ES6 Promise

    Promise 的状态只有两种可能,从 pending 变为 fulfilled 和 从 pending 变为 rejected,一旦状态变化,就不会再改变

    Leophen
  • JavaScript闭包(Closure)

    上面的代码中,函数 f2 就被包括在函数 f1 内部,这时 f1 内部的所有局部变量,对 f2 都是可见的。

    Leophen
  • JSON 的简介与使用

    JSON(javascript object notation)全称是 javascript 对象表示法,是一种数据交换的文本格式,用于读取结构化数据,提出目的...

    Leophen
  • Vue路由实现页面跳转的两种方式(router-link和JS)

    Vue.js 路由可以通过不同的 URL 访问不同的内容,实现多视图的单页 Web 应用

    Leophen
  • Vue模板语法与常用指令总结

    Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。在底层的实现上,Vue 将模板编译成虚拟 DOM ...

    Leophen
  • SpringBoot优雅地配置日志

    我们可以通过一个配置文件来灵活地进行上面的配置,而不需要修改应用的代码。Log4j作为当时作为最先比较流行的日志框架,给我们在应用开发和维护带来了很大的便捷。

    乱敲代码
  • JavaScript原型和原型链( prototype 与 __proto__ )

    var a = new A; //a 类型:对象 //A 类型:函数 var Object = new Function(); //var 对象 = new...

    Leophen
  • 跨域的简介与解决方案

    跨域是指一个域下的文档或脚本试图去请求另一个域下的资源(只要域名、协议和端口有任一个不同,就被当作是跨域)

    Leophen
  • Vuex状态管理总结

    3、Vuex 应用的核心是 store(仓库)-- 包含 state(组件中的共享状态)和 mutations(改变状态的方法)

    Leophen
  • Ajax 的简介与使用

    Ajax 的全称是 Asynchronous JavaScript and XML(即异步的 JavaScript 和 XML),是一种在无需重新加载整个网页的...

    Leophen

扫码关注云+社区

领取腾讯云代金券