路由 (Routing)
字数
492 字
阅读时间
2 分钟
路由服务由 @chatluna/routing 提供,挂载在 ctx.routing 上。它负责解析场景规则,并向其他服务提供按主体(subject)生效的合并配置。
读取
你可以通过以下方法查询已注册的规则或获取解析结果:
| 方法 | 作用 |
|---|---|
resolve(input) | 计算完整的 Resolution(冻结快照) |
valuesAt(subject, ns) | 获取指定命名空间合并后的值 |
explain(input) | 返回解析过程与来源,用于诊断 |
rules() / rule(id) | 获取规则列表或单条规则 |
revision | 当前修订号 |
其中 Resolution 是只读的冻结快照,包含 ruleIds、values、sources、suppressed、diagnostics 与 revision 等字段。
写入
路由服务支持动态创建、更新与删除规则:
| 方法 | 作用 |
|---|---|
save(input, { revision?, by? }) | 新建或更新规则,并返回新规则 |
remove(id, options) | 删除规则 |
其中的 revision 用于实现乐观锁并发控制。当传入过期的旧修订号时,操作会抛出 CONFLICT 错误。
谓词
通过注册自定义谓词,你可以为场景匹配增加自定义判断条件:
ts
ctx.routing.predicate('my:match', {
evaluate: (args, input) => boolean,
})谓词会在规则匹配阶段实时调用,其求值函数必须轻量且无副作用。当规则中包含内容相关的动态谓词时,系统会自动跳过解析结果缓存。
目录与对端
ctx.routing.directory:可路由对象(群、频道等)的目录服务。ctx.routing.peers:对端实体资料的缓存。
与 schema 的关系
路由服务仅负责规则的取值与合并,并不直接管理前端配置界面。配置项的展示结构由 ctx.schemas.section 统一声明和注册。
详细说明请参考 扩展路由命名空间。