使用tsoa与swagger-ui时如何为路由添加多类静态路径前缀
tsoa多路径前缀配置解决方案
方案1:控制器层级指定路由前缀(原生支持,适配绝大多数场景)
直接在控制器的@Route装饰器中补全完整前缀即可,无需修改全局baseDir配置:
- 需走
/public前缀的控制器写法示例:
import { Route, Controller, Get } from 'tsoa'; @Route('/public/pets') export class PublicPetsController extends Controller { @Get('/') public async getPets() { // 接口逻辑 } }
- 需走
/secured前缀的控制器写法示例:
import { Route, Controller, Get, Security } from 'tsoa'; @Route('/secured/pets') export class SecuredPetsController extends Controller { @Security('jwt') @Get('/') public async getSecuredPets() { // 接口逻辑 } }
该方式生成的swagger路径会自动携带前缀,最终接口路径为http://你的域名/public/pets、http://你的域名/secured/pets,符合需求。
方案2:多配置文件生成独立路由(适合两类接口完全隔离的场景)
如果/public和/secured两类接口需要完全拆分、独立配置鉴权中间件,可采用多套tsoa配置的方案:
- 新建两套tsoa配置文件
tsoa-public.json:配置basePath为/public,指定仅扫描public类控制器所在目录,路由输出路径设为src/routes/public.ts,openapi spec输出路径设为public/swagger-public.jsontsoa-secured.json:配置basePath为/secured,指定仅扫描secured类控制器所在目录,路由输出路径设为src/routes/secured.ts,openapi spec输出路径设为public/swagger-secured.json
- 修改生成命令,同时运行两套配置的生成逻辑:
{ "scripts": { "tsoa:gen": "tsoa spec-and-routes -c tsoa-public.json && tsoa spec-and-routes -c tsoa-secured.json" } }
- 服务启动时分别挂载路由,可直接给不同前缀绑定全局中间件:
// express示例 import express from 'express'; import { RegisterRoutes as registerPublicRoutes } from './routes/public'; import { RegisterRoutes as registerSecuredRoutes } from './routes/secured'; import jwtAuth from './middleware/jwtAuth'; const app = express(); app.use(express.json()); // 公开接口直接挂载 registerPublicRoutes(app); // 鉴权接口统一加jwt校验中间件 app.use('/secured', jwtAuth); registerSecuredRoutes(app);
如果需要合并swagger文档展示,可在swagger-ui初始化时合并两份spec,或者单独做两个swagger入口分别对应两类接口。
内容的提问来源于stack exchange,提问作者Griff
相关产品推荐
相关产品推荐

