ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何用 puter.kv 的 key 与 value 大小限制正确存储大对象?

如何用 puter.kv 的 key 与 value 大小限制正确存储大对象? 如何用 puter.kv 的 key 与 value 大小限制正确存储大对象【免费下载链接】puter The Internet Computer! Free, Open-Source, and Self-Hostable.项目地址: https://gitcode.com/GitHub_Trending/pu/puter在 Puter.js 应用中把较长的文本、JSON 对象或不断增长的集合写入用户的云键值存储puter.kv时会撞上两条固定的大小限制key最大1 KBvalue最大400 KB超限的写入会被直接拒绝而不是截断。这篇文章基于 puter.kv.set() 文档 与 大小限制说明给出一条可照做的路径运行时读取真实限额 → 写入前检查大小 → 超限的集合拆成多个前缀 key → 用set/get/list验证结果。适用前提代码运行在 Puter.js 支持的环境websites、apps、nodejs、workers中通过script srchttps://js.puter.com/v2//script引入 SDK。注意每个应用在每个用户账号下都有独立的 key-value store其他应用只能在你显式授权后访问。限额一览1 KB 的 key、400 KB 的 value官方限额表 明确这些大小对所有账号类型Paid、Free、Anonymous固定不变项目限制key1 KBvalue400 KBvalue 中出现的任意数字±9,007,199,254,740,991253−1两点容易踩坑的地方文档统一称 value 上限为 400 KB但仓库中的常量与 API 测试套件断言的实际字节数是399 * 1024见 validate.js 与 kv.suite.ts。因此代码里不要手写400 * 1024一律以运行时属性为准。数字超限不会被拒绝超出 ±253−1 的数字会被 clamp 到边界存储NaN被存成null与JSON.stringify行为一致。必须保持精确的大 id 或累计值应存成字符串。运行时读取真实限额puter.kv.MAX_KEY_SIZE与puter.kv.MAX_VALUE_SIZE是puter.kv上的只读属性分别返回 key 与 value 的最大字节数。来自 MAX_VALUE_SIZE 文档 和 MAX_KEY_SIZE 文档 的示例html body script srchttps://js.puter.com/v2//script script puter.print(Max Key Size: puter.kv.MAX_KEY_SIZE); puter.print(Max Value Size: puter.kv.MAX_VALUE_SIZE); /script /body /html后续所有大小判断都应引用这两个属性而不是硬编码字节数。写入前检查大小客户端校验器对 value 的比较逻辑是取value.length与MAX_VALUE_SIZE比较见 validate.js 中的assertValueSize。对字符串 value你可以直接复现这道检查在set之前拦截超限数据// text 为你的业务数据示例用长字符串演示 if (text.length puter.kv.MAX_VALUE_SIZE) { // 不要直接写入转用本文拆分大集合一节的方案 puter.print(value 超出限额需拆分为多个 key); } else { const ok await puter.kv.set(longText, text); puter.print(Key-value pair created/updated: ${ok}); // true }对象和数组按文档说明原样存储、原样取回但文档没有给出对象序列化后按什么口径计量字节接近 400 KB 的集合请直接用下一节的拆分方案不要赌单次写入能过。批量写入同样受限set([...])中每个 item 都遵循同样的 1 KB key / 400 KB value 限制见 set.md 的 items 参数说明。超限写入会被客户端直接拒绝拒绝发生在客户端set返回的 Promise 会以一个带code的稳定错误对象 reject而不是把数据写坏或截断。仓库 API 测试套件 断言了确切行为可以按此核对你的代码// value 超限code 为 value_too_large puter.kv.set(valueTooLargeKey, v.repeat(puter.kv.MAX_VALUE_SIZE 1)) .catch((err) { puter.print(err.code); // value_too_large puter.print(err.message); // Value size cannot be larger than ${puter.kv.MAX_VALUE_SIZE} }); // key 超限code 为 key_too_largedel 对超限 key 同样拒绝 puter.kv.set(k.repeat(puter.kv.MAX_KEY_SIZE 1), x) .catch((err) puter.print(err.code)); // key_too_large所以在生产代码里set的失败分支应至少区分这两种 code用于区分key 命名有问题和value 太大需要拆分。超过 400 KB 的集合按前缀拆成多个 key官方 recipe Managing a collection of key-value entries 给出的适用条件正是本场景集合对单条 entry 来说太大超过 400 KB或者记录需要各自独立过期。做法是每条记录一个 key把最常过滤的字段放在 key 最前面// todo:category:idcategory 与 id 替换为你的业务字段 await puter.kv.set(todo:${category}:${id}, { text: Buy milk, done: false });拆开后单记录操作都变成直接调用不需要先读出整个集合const key todo:${category}:${id}; await puter.kv.update(key, { done: true }); // 改一个字段 await puter.kv.set(key, { text: Buy oat milk, done: false }); // 整条替换 await puter.kv.del(key); // 删除 await puter.kv.expire(key, 60 * 60 * 24); // 独立 24 小时过期读取时按前缀取回一片list的第二参数为true时连值一起返回结果按 key 字典序排序const rows await puter.kv.list(todo:${category}:, true); // rows: [ { key: todo:home:a, value: { text: Buy milk, done: false } }, ... ]数据更多时用limitcursor翻页直到某页不再带cursorlet cursor; do { const page await puter.kv.list({ pattern: todo:${category}:, returnValues: true, limit: 100, cursor, }); render(page.items); cursor page.cursor; } while (cursor);使用这条路径时的边界均来自 recipe 原文匹配模式是纯前缀*只能出现在末尾所以 key 只提供一维过滤第二维过滤需要list后在客户端filter。结果按 key 字典序排序数字 id 想按数值排序要补零如todo:home:000042。每一页list都计费且不带 pattern 的裸list()会读整个 store——务必传pattern、limit或两者。key 布局即访问边界如果对外的 Events share handle 绑定在某前缀上重构 key 会弄坏已发出的 handle应授予workspace:uuid:这类稳定合成段而非会被改名的语义前缀见 KV Store 概览。验证写入结果三条验证手段都来自文档的明确行为可按顺序执行puter.kv.set在 key-value 对被创建或更新成功后 resolve 为trueconst ok await puter.kv.set(name, Puter Smith); puter.print(Key-value pair created/updated: ${ok}); // trueputer.kv.get取回值key 不存在时 resolve 为undefinedget 文档const name await puter.kv.get(name); puter.print(Name is: ${name}); // Puter Smith拆分后的集合用前缀list核对条数与内容const keys await puter.kv.list(todo:home:); // 只列 key const rows await puter.kv.list(todo:home:, true); // key 与 value如果写入失败检查上一步描述的value_too_large/key_too_large错误 code回到写入前检查大小或拆分一节处理而不是反复重试原写入。限制与边界大小限制对所有账号固定Key 1 KB、Value 400 KB超限直接拒绝不存在通过升级账号放宽的说明限额表。value 内的数字在 ±253−1 之外会被 clamp 存储、NaN存为null需要精确的超大整数存字符串。每个应用的 store 位于各自用户账号内跨用户共享数据不在puter.kv能力范围内文档建议用 Serverless Worker 提供集中式后端。disableSharing: true写入的条目不会被其他应用读取、列举、修改或删除即使对方拿到了appData授权——适合存放令牌等敏感大对象。【免费下载链接】puter The Internet Computer! Free, Open-Source, and Self-Hostable.项目地址: https://gitcode.com/GitHub_Trending/pu/puter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表