Node 路由文件自动引入

75 阅读1分钟

1. ES Module

  1. 文件层级
  • src
    • routers
      • index.ts
      • login.router.ts

路由文件需要有 router 后缀,方便后续自动化。实现自动化思路:首先,读取当前文件下所有文件,如果不是以 router.ts 结尾,直接结束此次循环,否则读取路由文件信息进行配置,由于是默认导出,所以在进行路由配置的时候需要用到 default 参数。

// login.router.ts
import express from 'express'
import { verifyUser } from '../middleware/login.middleware'

const loginRouter = express.Router()

loginRouter.post('/login', verifyUser)

export default  loginRouter 

// index.ts
import fs from 'fs'
import express from 'express'

export const registerRouter = (app: ReturnType<typeof express>) => {
  const files = fs.readdirSync(__dirname)
  for (const file of files) {
    if (!file.endsWith('.router.ts')) {
      continue
    }
    const router = require(`./${file}`)
    app.use(router.default)
  }
}

2. CommonJs

// catalog.router.js
const express = require('express')
const router = express.Router()
router.get('/', book_controller.index)
router.get('/book/create', book_controller.book_create_get)

module.exports = router

// index.js
var fs = require('fs')
var express = require('express')
var router = express.Router()

/*  If you can use the redirect router, you can dispose it in index.js file. */
router.get('/', function (req, res, next) {
  res.redirect('/catalog')
})

function registerRouter(app) {
  // configure redirect
  app.use('/', router)
  const files = fs.readdirSync(__dirname)
  for (const file of files) {
    if (!file.endsWith('.router.js')) {
      continue
    }
    const router = require(`./${file}`)
    const prefixRouterName = file.split('.')[0]
    app.use(`/${prefixRouterName}`, router)
  }
}

module.exports = registerRouter