路由
VextJS 采用 约定式文件路由 + 三段式路由定义,将文件路径自动映射为 URL 前缀,在文件内部通过 defineRoutes() 声明具体路由。
基本概念
文件路由映射
src/routes/ 目录下的每个文件自动映射为一个 URL 前缀:
三段式定义
VextJS 路由使用 三段式 (path, options, handler) 或 两段式 (path, handler) 定义:
三段式中第二个参数 options 是一个声明式配置对象,包含:
路由文件写法
每个路由文件使用 defineRoutes() 导出路由定义:
HTTP 方法
defineRoutes() 回调中的 app 对象支持以下 HTTP 方法:
动态路由参数
文件级动态参数
使用 [paramName] 作为文件名或目录名,自动转换为路由动态参数:
路由内动态参数
在文件内部的路由路径中也可以使用 :paramName 语法:
请求对象 (req)
路由 handler 的第一个参数 req 是框架统一的 VextRequest 对象,与底层 Adapter 解耦:
常用属性
req.valid() — 获取校验后数据
当路由配置了 validate 选项时,使用 req.valid() 获取经过校验和类型转换后的数据:
req.valid() 支持四个位置:
可以使用泛型获取更精确的类型提示:
req.onClose() — 连接关闭钩子
注册请求关闭时的回调(客户端断开连接时触发),常用于 SSE / 长连接场景:
响应对象 (res)
路由 handler 的第二个参数 res 是框架统一的 VextResponse 对象:
res.json() — JSON 响应
当 response-wrapper 中间件启用时(默认启用),res.json() 会自动将响应包装为统一格式:
错误响应由全局错误处理器统一返回:
res.text() — 纯文本响应
res.stream() — 流式响应
res.download() — 文件下载
res.redirect() — 重定向
链式调用
res.status() 和 res.setHeader() 支持链式调用:
res.statusCode — 读取状态码
在洋葱模型的 after-middleware 阶段,可以读取最终响应状态码:
参数校验
VextJS 集成 schema-dsl,在路由 options.validate 中声明校验规则,框架自动执行校验并生成 OpenAPI 文档。
DSL 语法速查
校验位置
校验顺序:param → query → header → body。任一位置校验失败会立即返回 422 错误响应。
校验错误响应
校验失败时框架自动返回结构化的错误信息:
路由级中间件
通过 options.middlewares 为路由指定中间件。中间件必须先在 config/default.ts 的 middlewares 白名单中注册:
中间件按声明顺序执行,在 handler 之前运行。
OpenAPI 文档配置
通过 options.docs 配置路由的 OpenAPI 文档信息:
隐藏路由
不希望出现在 OpenAPI 文档中的路由,设置 docs.hidden: true:
访问 app 对象
defineRoutes() 的回调参数 app 提供了框架的完整能力:
路由 handler 中可以通过两种方式访问 app:
- 闭包
app(推荐):defineRoutes((app) => ...)中的app参数 req.app:请求对象上的app引用
两者指向同一个 VextApp 实例。闭包方式更简洁,req.app 主要用于中间件中(中间件没有 defineRoutes 闭包)。
错误处理
app.throw() — 抛出 HTTP 错误
在路由或服务中使用 app.throw() 抛出错误,框架会统一处理并返回结构化响应:
app.throw() 会终止当前请求处理流程(函数签名返回 never),无需在其后添加 return。
路由加载优先级
当存在可能冲突的路由时,router-loader 按以下规则处理:
- 静态路由优先于动态路由:
/users/list优先于/users/:id - 文件按字母序排序:确保加载顺序确定性
- 同一前缀不允许重复定义:
routes/users.ts和routes/users/index.ts不能同时存在(框架会报错)
排除规则
以下文件不会被当作路由加载:
- 测试文件:
*.test.ts、*.spec.ts - 以
_或.开头的文件或目录 node_modules目录
可以利用 _ 前缀创建路由共享的工具模块:
完整示例
下一步
- 了解 服务层 如何组织业务逻辑
- 学习 中间件 的洋葱模型
- 探索 参数校验 的高级用法
- 查看 OpenAPI 文档 自动生成