错误 API
用途与前置条件
所有领域失败都使用从 permission-core 导出的 PermissionCoreError。按 code 与 details.kind 分支,不要解析 message 文本。can() 返回的布尔拒绝不是异常;assert() 会把同一拒绝转换为 PERMISSION_DENIED。
我想做什么
签名
Details discriminator 包括 validation、limit-exceeded、data-value-unsupported、close-timeout、revision-conflict、read-conflict、preview-stale、cursor-stale、preview-required、menu-management-preview-conflict、capacity-risk-ack-required、persisted-state-invalid、unexpected-post-image-field、schema-version-mismatch、schema-contract-mismatch、database-failure、audit-lookup、reconcile-superseded。
错误对象详解
PermissionCoreError
- 用途:表示 permission-core 的领域/运行时失败;正常消费者主要捕获它,而不是自行构造。
- 参数:构造细节不是稳定的消费契约;捕获后读取上表字段,尤其是
code、details.kind、retryable与committed。 - 识别:同一包实例中使用
error instanceof PermissionCoreError,再按error.code/details.kind收窄。 - 状态影响:错误对象本身不修改状态;
committed描述抛错前的写入事实。 - 原始返回:它是被抛出或 reject 的
PermissionCoreError实例,不是 HTTP JSON;Vext 的公开错误响应由插件另行映射。 - 边界:
can()的false是正常拒绝结果,不会创建 error;需要异常控制流时调用assert()。
响应与副作用
Vext 插件将错误映射为以下公开 JSON 结构,并保留请求/操作关联:
这是 Vext HTTP error response,不是 Node.js PermissionCoreError 对象的直接 JSON 序列化。Vext 会按公开边界选择字段,并在 500 时隐藏内部 message。
状态为 500 时,插件把公开 message 替换为 Internal Server Error。仅在存在时包含 details、committed、operationId。
失败与限制
不要只根据状态码重试。revision/preview/cursor 冲突要重新读取;MENU_MANAGEMENT_PREVIEW_CONFLICT 表示增量菜单自动提交需要管理员显式预览确认;配置/schema/持久化状态要先修复;不确定写入使用原幂等键。committed: true 表示即使后续运维步骤失败,状态变化也已经发生。
示例
这是示例 handler 自行返回的业务 HTTP 摘要。subject.assert() 的原始行为是:允许时 resolve void;拒绝时 reject PermissionCoreError。catch 中的返回对象不由 permission-core 自动生成。
推荐恢复顺序:
REVISION_CONFLICT/CURSOR_STALE/PREVIEW_STALE:重新读取当前状态,重新构造用户确认并重试,不复用旧 token/cursor。DATABASE_UNAVAILABLE/READ_CONFLICT且retryable=true:采用宿主有界退避;先检查committed,保留原 idempotency key。INVALID_*、权限拒绝、字段拒绝:修正调用或权限,不原样重试。- schema/config/persisted-state 错误:停止 readiness,修复部署契约后再启动。
相关内容
参见故障排查、生产运维和Vext 插件 API。