Files
Docker-Proxy/hubcmdui/routes/index.js

79 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 路由注册器
* 负责注册所有API路由
*/
const fs = require('fs');
const path = require('path');
const logger = require('../logger');
// 检查文件是否是路由模块
function isRouteModule(file) {
return file.endsWith('.js') &&
file !== 'index.js' &&
file !== 'routeLoader.js' &&
!file.startsWith('_');
}
/**
* 注册所有路由
* @param {Express} app - Express应用实例
*/
function registerRoutes(app) {
const routeDir = __dirname;
try {
const files = fs.readdirSync(routeDir);
const routeFiles = files.filter(isRouteModule);
logger.info(`发现 ${routeFiles.length} 个路由文件待加载`);
routeFiles.forEach(file => {
const routeName = path.basename(file, '.js');
try {
const routePath = path.join(routeDir, file);
const routeExport = require(routePath); // 加载导出的模块
// 优先处理 { router: routerInstance, ... } 格式
if (routeExport && typeof routeExport === 'object' && routeExport.router && typeof routeExport.router === 'function' && routeExport.router.stack) {
app.use(`/api/${routeName}`, routeExport.router);
logger.info(`✓ 挂载路由对象: /api/${routeName}`);
}
// 处理直接导出 routerInstance 的情况 (更严格的检查)
else if (typeof routeExport === 'function' && routeExport.handle && routeExport.stack) {
app.use(`/api/${routeName}`, routeExport);
logger.info(`✓ 挂载路由: /api/${routeName}`);
}
// 处理导出 { setup: setupFunction } 的情况
else if (routeExport && typeof routeExport === 'object' && routeExport.setup && typeof routeExport.setup === 'function') {
routeExport.setup(app);
logger.info(`✓ 初始化路由: ${routeName}`);
}
// 处理导出 setup 函数 (app) => {} 的情况
else if (typeof routeExport === 'function') {
// 检查是否是 Express Router 实例 (避免重复判断 Case 3)
if (!(routeExport.handle && routeExport.stack)) {
routeExport(app);
logger.info(`✓ 注册路由函数: ${routeName}`);
} else {
logger.warn(`× 路由 ${file} 格式疑似 Router 实例但未被 Case 3 处理,已跳过`);
}
}
// 其他无法识别的格式
else {
logger.warn(`× 路由 ${file} 导出格式无法识别 (${typeof routeExport}),已跳过`);
}
} catch (error) {
logger.error(`× 加载路由 ${file} 失败: ${error.message}`);
// 可以在这里添加更详细的错误堆栈日志
logger.debug(error.stack);
}
});
logger.info('所有路由注册完成');
} catch (error) {
logger.error(`路由注册失败: ${error.message}`);
}
}
module.exports = registerRoutes;