路由定义
本页详细介绍 VextJS 的路由定义 API,包括 defineRoutes、路由选项、参数校验、中间件引用和文档配置。
defineRoutes
defineRoutes 是创建路由文件的核心函数。它接收一个工厂回调,在回调中通过 app 对象注册路由。
函数签名
工作原理
defineRoutes(factory)被调用时,内部创建一个 collector(路由收集器)factory(collector)被执行,用户代码中的app.get/post/...实际调用 collector 的方法- 每条路由被推入内部的
routes数组 - 返回
RouteDefinition对象 router-loader扫描src/routes/目录,对每个文件的default export调用register()注册到底层适配器
在 factory 回调中,app 不仅有 HTTP 方法(get/post/put/...),还可以访问 app.services、app.config、app.throw、app.logger 等完整能力。这些属性由 router-loader 在执行 factory 前注入。
路由注册语法
VextJS 支持三段式和两段式两种路由注册语法。
三段式(推荐)
带有 options 配置的完整语法,支持参数校验、中间件引用、文档配置等:
两段式
无 options 的简化语法,适用于不需要校验、中间件或文档配置的简单路由:
支持的 HTTP 方法
路由路径
静态路径
动态参数
使用 :paramName 定义动态路径参数,通过 req.params 或 req.valid('param') 访问:
通配符
文件路由映射
路由文件的目录路径自动映射为 URL 前缀:
路由文件中注册的 path 是相对子路径,框架自动拼接文件路径前缀。例如 src/routes/users.ts 中的 app.get('/:id') 最终注册为 GET /users/:id。
RouteOptions
路由三段式语法的第二个参数,声明式配置对象。
完整示例
validate
声明式参数校验,基于 schema-dsl DSL 语法。框架自动在 handler 执行前进行校验,校验失败返回 400 错误。
校验位置
校验执行顺序:param → query → header → body
基本用法
DSL 语法速查
schema-dsl 会自动做类型转换。例如查询参数 ?page=2 中的 '2'(字符串)会被自动转换为 2(数字),前提是 schema 声明为 'number' 类型。
获取校验后数据
使用 req.valid(location) 获取校验并类型转换后的数据:
可以通过泛型获得更精确的类型提示:
校验失败响应
校验失败时框架自动返回 400 状态码:
middlewares
路由级中间件引用。引用的中间件必须先在 config.middlewares 白名单中声明。
字符串引用
对象引用(带配置覆盖)
VextMiddlewareRef 类型
执行顺序
路由级中间件在全局中间件之后、handler 之前执行:
配置白名单
路由中引用的中间件必须在配置文件中声明:
引用未在白名单中声明的中间件会在启动时抛出错误:
docs
OpenAPI 文档配置,控制路由在自动生成的 API 文档中的展示方式。
RouteDocsConfig
字段说明
完整示例
operationId 自动推断
未指定 operationId 时,框架根据 HTTP 方法和路径自动生成:
隐藏路由
标记废弃
安全方案覆盖
默认情况下,安全方案从 middlewares 自动推断(通过 config.openapi.guardSecurityMap 映射)。可手动覆盖:
响应定义
多示例响应:
自定义响应头:
override
路由级配置覆盖,覆盖 src/config/default.ts 中的全局配置。
RouteDefinition
defineRoutes() 返回的路由定义对象(内部数据结构,通常不需要直接操作)。
RouteRecord
单条路由的内部数据结构:
VextHandler
路由处理函数的类型定义:
Handler 是中间件链的最后一环,不调用 next()。
基本示例
访问 App 能力
在 defineRoutes 的 factory 回调中,通过闭包访问 app:
多路由注册
一个路由文件中可以注册多条路由:
注意事项
不要直接在 app 上调用 HTTP 方法
defineRoutes 返回的 app 是一个收集器,不是真正的应用实例。直接在应用实例上调用 HTTP 方法会抛出错误:
路由文件必须 default export
路由路径规范化
框架自动处理以下路径边界情况: