You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用routing-controllers的Express项目中获取控制器类名列表而非类对象

如何在使用routing-controllers的Express项目中获取控制器类名列表而非类对象

我来帮你搞定这个问题!从你的代码和输出来看,你现在拿到的是嵌套的控制器类对象数组,要提取类名其实只需要利用JavaScript类的name属性,调整一下映射逻辑就可以了。

你当前的代码最终得到的是类对象的一维数组,想要换成类名的话,只需要在最内层的映射步骤里,把返回类对象改成返回类的name属性就行。

修改后的代码

import "reflect-metadata";

import express from 'express';
import dotenv from 'dotenv';
import { useExpressServer } from 'routing-controllers';
import {  connectDB } from './config/db';
import requireAll from 'require-all';
import path from 'path';
import { fileURLToPath } from 'url';

dotenv.config();
const app = express();

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 提取控制器类名的逻辑
const controllerNames = Object.values(
  requireAll({
    dirname: path.join(__dirname, 'controllers'),
    filter: /(.+\.controller)\.(ts|js)$/,
  })
).map((controllerModule: any) =>
  Object.values(controllerModule).map((controller: any) => {
    const ctrl = controller.default || controller;
    return ctrl.name; // 提取类的名称属性
  })
).flat();

// 保留路由注册所需的类对象数组
const controllers = Object.values(
  requireAll({
    dirname: path.join(__dirname, 'controllers'),
    filter: /(.+\.controller)\.(ts|js)$/,
  })
).map((controllerModule: any) =>
  Object.values(controllerModule).map((controller: any) => controller.default || controller)
).flat();

useExpressServer(app, {
  controllers, // 路由注册仍需传入类对象
});

const port =  3000;

connectDB().then(() => {
  console.log("controller names", controllerNames); // 现在会输出 ["Demo1Controller", "Demo2Controller"]
  app.listen(port, () => {
    console.log("Successfully running on ", `${port}`);
  });
});

关键说明

  1. 类的name属性:JavaScript中每个类构造函数都自带name属性,会返回类的字符串名称,正好匹配你的需求。
  2. 区分路由注册和类名提取:注意useExpressServer必须传入类对象数组才能正常注册路由,所以如果既要实现路由功能又要输出类名,需要分别处理两个逻辑(也可以封装成公共函数避免重复代码)。
  3. 兼容不同导出方式:代码里的controller.default || controller是为了兼容默认导出和命名导出的控制器模块,确保不管哪种导出方式都能正确拿到目标类。

如果你之前尝试map没成功,大概率是没有在正确的层级提取name属性,或者没处理好嵌套数组的扁平化问题。现在这样调整后,就能得到你想要的类名列表了。

备注:内容来源于stack exchange,提问作者M BHARATH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:25:31