如何从 nodejs 中的多个目录导入所有快速路由器文件?
How to import all express router files from multiple directories in nodejs?
我正在构建一个具有版本控制支持的 REST API。这是我的目录结构。
.
├── src
│ ├── api
│ │ ├── v1
│ │ │ ├── modules ─ ...
│ │ │ ├── routers
│ │ │ │ ├─── auth.router.js
│ │ │ │ ├─── posts.router.js
│ │ ├── v2
│ │ │ ├── modules ─ ...
│ │ │ ├── routers ─ ...
├── app.js
我想将路由器文件导入到 app.js
。我已经寻找了几个小时的解决方案,但我发现的只是如何通过 app.use()
手动导入每个文件。这是可行的,但随着版本号和路由器文件不断增加,这可能会导致冗余工作。我需要一种方法来以尽可能少的手动代码行导入这些文件。
用 Express 是不可能直接做到这一点的,通常人们用 NodeJS 手动管理模块,因为它根本不需要很多工作。在版本号方面,您可以在某处指定版本设置或常量,并根据该版本号导入。
例如:
// routes.js
const apiVersion = "v2";
module.exports = {
require(`./${apiVersion}/auth.route`),
}
如果这不是理想的,管理它的一种 hacky 方法是使用 fs 模块获取所有路由文件,并自动导入它们。这是一种很老套的做法,但我想出了这样的办法:
// router.js
const fs = require("fs/promises");
const { Router } = require("express");
const router = Router();
const apiVersion = "v2";
const loadRoutes = async () => {
// grab all the route files from a directory using fs
// use require to grab them from the source files
}
const routes = loadRoutes();
routes.forEach(route => {
router.use(route);
})
// app.js
const router = require("./path/to/router");
// ...boilerplate
app.use(router);
我正在构建一个具有版本控制支持的 REST API。这是我的目录结构。
.
├── src
│ ├── api
│ │ ├── v1
│ │ │ ├── modules ─ ...
│ │ │ ├── routers
│ │ │ │ ├─── auth.router.js
│ │ │ │ ├─── posts.router.js
│ │ ├── v2
│ │ │ ├── modules ─ ...
│ │ │ ├── routers ─ ...
├── app.js
我想将路由器文件导入到 app.js
。我已经寻找了几个小时的解决方案,但我发现的只是如何通过 app.use()
手动导入每个文件。这是可行的,但随着版本号和路由器文件不断增加,这可能会导致冗余工作。我需要一种方法来以尽可能少的手动代码行导入这些文件。
用 Express 是不可能直接做到这一点的,通常人们用 NodeJS 手动管理模块,因为它根本不需要很多工作。在版本号方面,您可以在某处指定版本设置或常量,并根据该版本号导入。
例如:
// routes.js
const apiVersion = "v2";
module.exports = {
require(`./${apiVersion}/auth.route`),
}
如果这不是理想的,管理它的一种 hacky 方法是使用 fs 模块获取所有路由文件,并自动导入它们。这是一种很老套的做法,但我想出了这样的办法:
// router.js
const fs = require("fs/promises");
const { Router } = require("express");
const router = Router();
const apiVersion = "v2";
const loadRoutes = async () => {
// grab all the route files from a directory using fs
// use require to grab them from the source files
}
const routes = loadRoutes();
routes.forEach(route => {
router.use(route);
})
// app.js
const router = require("./path/to/router");
// ...boilerplate
app.use(router);