createQueryOptionsKey()
function createQueryOptionsKey(options, label?): string;
Defined in: packages/utils/src/object/createQueryOptionsKey.ts:92
计算查询选项的内容 key,并把游标实体投影成确定的数据快照。
Parameters
| Parameter | Type | Default value | Description |
|---|---|---|---|
options | unknown | undefined | 查询选项;after / before 允许是真实实体实例 |
label | string | 'Query options' | 错误信息前缀,用于让报错带上调用方语境(如 'RxDB query options') |
Returns
string
与「选项内容 + 游标身份」一一对应的稳定 key
Throws
选项或游标身份字段中含函数、symbol、无法识别的宿主对象或循环引用时抛出
Remarks
RVU-001 / RRE-002:FindByCursorOptions.after/before 的公开类型就是 InstanceType<T>,
而实体由 Object.create(EntityType.prototype) 造出、再包一层只有 set 陷阱的 Proxy,
Object.getPrototypeOf 透传回 EntityType.prototype —— 整包丢给 createStableKey
必然命中它的「非 plain 宿主对象」拒绝分支,组件在 setup / render 阶段直接抛 TypeError,
「从某条继续往下滚」这个最常见用法一次查询都发不出去。
修法不是放开宿主对象兜底(那正是 createStableKey 要防的
「WeakMap/DOM 节点的 Object.keys 同样为空、被静默视作等价」),
而是让 key 理解游标语义:游标身份 = orderBy 各字段在游标上的取值。
因为 orderBy 必须以 id 结尾,这组取值足以唯一确定一个游标位置;
非 orderBy 字段(标题、更新时间…)的变化不构成新游标,
否则活查询回填这些字段就会触发重订阅 → 再回填的无限重查。
三框架绑定共用本函数,避免各写一套后语义漂移。
投影只发生在顶层 after / before:自引用的 options 会把序列化带回原始对象、
撞上未投影的游标原型,报「serializable」而非「circular」。两者都是 TypeError,
都不产出 key、也不无限递归,自引用的查询选项本就不是受支持的输入。
Example
const key = createQueryOptionsKey(
{ where, orderBy: [{ field: 'createdAt', sort: 'desc' }, { field: 'id', sort: 'asc' }], after: entity },
'RxDB query options'
);
// 同 identity 的新实例算出同一个 key;换一条游标才会变