如何在使用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}`); }); });
关键说明
- 类的
name属性:JavaScript中每个类构造函数都自带name属性,会返回类的字符串名称,正好匹配你的需求。 - 区分路由注册和类名提取:注意
useExpressServer必须传入类对象数组才能正常注册路由,所以如果既要实现路由功能又要输出类名,需要分别处理两个逻辑(也可以封装成公共函数避免重复代码)。 - 兼容不同导出方式:代码里的
controller.default || controller是为了兼容默认导出和命名导出的控制器模块,确保不管哪种导出方式都能正确拿到目标类。
如果你之前尝试map没成功,大概率是没有在正确的层级提取name属性,或者没处理好嵌套数组的扁平化问题。现在这样调整后,就能得到你想要的类名列表了。
备注:内容来源于stack exchange,提问作者M BHARATH
相关产品推荐
相关产品推荐

