index.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /**
  2. * 路由注册器
  3. * 负责注册所有API路由
  4. */
  5. const fs = require('fs');
  6. const path = require('path');
  7. const logger = require('../logger');
  8. // 检查文件是否是路由模块
  9. function isRouteModule(file) {
  10. return file.endsWith('.js') &&
  11. file !== 'index.js' &&
  12. file !== 'routeLoader.js' &&
  13. !file.startsWith('_');
  14. }
  15. /**
  16. * 注册所有路由
  17. * @param {Express} app - Express应用实例
  18. */
  19. function registerRoutes(app) {
  20. const routeDir = __dirname;
  21. try {
  22. const files = fs.readdirSync(routeDir);
  23. const routeFiles = files.filter(isRouteModule);
  24. logger.info(`发现 ${routeFiles.length} 个路由文件待加载`);
  25. routeFiles.forEach(file => {
  26. const routeName = path.basename(file, '.js');
  27. try {
  28. const routePath = path.join(routeDir, file);
  29. const routeExport = require(routePath); // 加载导出的模块
  30. // 优先处理 { router: routerInstance, ... } 格式
  31. if (routeExport && typeof routeExport === 'object' && routeExport.router && typeof routeExport.router === 'function' && routeExport.router.stack) {
  32. app.use(`/api/${routeName}`, routeExport.router);
  33. logger.info(`✓ 挂载路由对象: /api/${routeName}`);
  34. }
  35. // 处理直接导出 routerInstance 的情况 (更严格的检查)
  36. else if (typeof routeExport === 'function' && routeExport.handle && routeExport.stack) {
  37. app.use(`/api/${routeName}`, routeExport);
  38. logger.info(`✓ 挂载路由: /api/${routeName}`);
  39. }
  40. // 处理导出 { setup: setupFunction } 的情况
  41. else if (routeExport && typeof routeExport === 'object' && routeExport.setup && typeof routeExport.setup === 'function') {
  42. routeExport.setup(app);
  43. logger.info(`✓ 初始化路由: ${routeName}`);
  44. }
  45. // 处理导出 setup 函数 (app) => {} 的情况
  46. else if (typeof routeExport === 'function') {
  47. // 检查是否是 Express Router 实例 (避免重复判断 Case 3)
  48. if (!(routeExport.handle && routeExport.stack)) {
  49. routeExport(app);
  50. logger.info(`✓ 注册路由函数: ${routeName}`);
  51. } else {
  52. logger.warn(`× 路由 ${file} 格式疑似 Router 实例但未被 Case 3 处理,已跳过`);
  53. }
  54. }
  55. // 其他无法识别的格式
  56. else {
  57. logger.warn(`× 路由 ${file} 导出格式无法识别 (${typeof routeExport}),已跳过`);
  58. }
  59. } catch (error) {
  60. logger.error(`× 加载路由 ${file} 失败: ${error.message}`);
  61. // 可以在这里添加更详细的错误堆栈日志
  62. logger.debug(error.stack);
  63. }
  64. });
  65. logger.info('所有路由注册完成');
  66. } catch (error) {
  67. logger.error(`路由注册失败: ${error.message}`);
  68. }
  69. }
  70. module.exports = registerRoutes;