Express路由自动搜索和生成

用Node写Express的时候 总是要指定路由 于是我写了一个根据目录自动生成路由的代码

Express 路由自动搜索

  • 目录结构

    1
    2
    3
    4
    5
    ├─api
    │ ├─user
    │ │ └─index.js
    │ └─index.js
    └─server.js
  • 新建根路由 index.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    import {
    Router
    } from 'express'
    import fs from 'fs'

    function search(root, dir, router) {
    let list = fs.readdirSync(dir);
    list.forEach(function (file) {
    let path = dir + '/' + file;
    let stat = fs.statSync(path);
    let routerPath = '/' + file.split('.')[0];
    if (stat && stat.isDirectory()) {
    router.use(routerPath, search(root, path, Router()))
    } else {
    let modulePath = dir.replace(root, '') + routerPath;
    // 此处require(...)必写字符串 + 变量的形式
    // 具体原因这两个链接
    // 问题相关的Github https://github.com/webpack/webpack/issues/196
    // 最终答案 http://webpack.github.io/docs/context.html
    let routerModule = require('.' + modulePath)
    // 如果不是ES6的方式导出 则改为
    // if (routerModule) {
    // router.use(routerPath === "/index" ? "" : routerPath, routerModule)
    // }
    if (routerModule && routerModule.default) {
    // 如果是 '/index' 则直接映射空路径
    // 不然路径映射会变成 /api/user/index/xxx
    router.use(routerPath === "/index" ? "" : routerPath, routerModule.default)
    }
    }
    })
    return router;
    }
    export default search(__dirname, __dirname, Router())
  • 新建 user/index.js 用户模块

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import {
    Router
    } from 'express';
    const router = Router();
    // 登录
    router.post('/login', async function (req, res, next) {
    res.json({ status: 200 });
    });

    // 退出登录
    router.get('/logout', function (req, res, next) {
    res.json({ status: 200 });
    });
    export default router;
  • 在 server.js 使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import express from 'express';
    import api from './api';

    const app = express();
    const host = process.env.HOST || '127.0.0.1';
    const port = process.env.PORT || 3000;

    app.set('port', port);

    // Import API Routes
    app.use('/api', api);

    // Listen the server
    app.listen(port, host);
    console.log(`Server listening on ${host}:${port}`); // eslint-disable-line no-console
  • 经测试 /api/user/login/api/login/logout 均可访问