如何用 puter.kv.set() 批量写入并用 disableSharing 标记私有条目?
【免费下载链接】puter🌐 The Internet Computer! Free, Open-Source, and Self-Hostable.项目地址: https://gitcode.com/GitHub_Trending/pu/puter
如果你的应用需要一次向用户自己的 KV 存储写入多条数据(配置、缓存、令牌等),并且其中某些条目绝不应被其他应用看到,Puter.js 的puter.kv.set()提供了批量写入形式和disableSharing选项来完成这件事。该接口适用于 websites、apps、nodejs 和 workers 平台(见 set.md 的平台声明),无需自建服务器:每个应用在每个用户账号下拥有独立的 KV 存储,数据读写由 Puter.js 处理。
准备条件
在页面或脚本中引入 Puter.js(以下示例沿用文档中的引入方式):
<script src="https://js.puter.com/v2/"></script>之后即可调用puter.kv.set()。文档示例统一使用puter.print()输出结果;如果你的运行环境不是网页,把输出换成自己的日志方式即可。
批量写入的调用形式
puter.kv.set()支持五种语法(引自 set.md):
puter.kv.set(key, value) puter.kv.set(key, value, expireAt) puter.kv.set({ key, value, expireAt }) puter.kv.set([ { key, value, expireAt }, ... ]) puter.kv.set({ items: [ { key, value, expireAt }, ... ] })批量形式中,items是{ key, value, expireAt? }对象数组,一次请求写入全部条目。两个数组形式等价:直接传数组set([...]),或包在对象里set({ items: [...] })。
文档给出的批量写入示例(可直接执行):
<html> <body> <script src="https://js.puter.com/v2/"></script> <script> (async () => { await puter.kv.set([ { key: 'name', value: 'Puter Smith' }, { key: 'age', value: 21 }, ]); puter.print('Batch set complete'); })(); </script> </body> </html>约束条件(单条和批量条目一致):
key为字符串,最大1 KB;value可以是 String、Number、Boolean、Object 或 Array,对象和数组原样存取,最大400 KB;- value 中的每个数字(包括嵌套在对象/数组里的)必须在±9,007,199,254,740,991(
Number.MAX_SAFE_INTEGER)以内;超出边界会被钳制到边界而不是拒绝,NaN会存为null。需要精确保存超过该边界的 id 或总额时,用字符串存; - 可选参数
expireAt是时间戳秒数,表示该 key 何时过期。
用 disableSharing 把整批条目标记为私有
disableSharing是一个布尔选项,通过尾随的 options 对象传入。单条写法:
puter.kv.set(key, value, { disableSharing: true })批量写法同样支持——尾随 options 作用于整批:
puter.kv.set([ { key: 'name', value: 'Puter Smith' }, { key: 'age', value: 21 }, { key: 'accessToken', value: 'secret-value' }, ], { disableSharing: true })完整可执行示例(组合了文档中批量写入与私有写入两个示例,写法均来自文档语法):
<html> <body> <script src="https://js.puter.com/v2/"></script> <script> (async () => { const success = await puter.kv.set([ { key: 'name', value: 'Puter Smith' }, { key: 'age', value: 21 }, { key: 'accessToken', value: 'secret-value' }, ], { disableSharing: true }); puter.print(`Batch set complete: ${success}`); })(); </script> </body> </html>disableSharing: true的效果(引自 set.md 与 Using another app's data):
- 该条目被标记为仅你的应用可见。任何其他应用都不能读取、列出、修改或删除它——即使用户已经通过
puter.perms.request('appData', …)把该应用的数据授权给了另一个应用; - 对其它应用的具体表现:读返回空,列表不包含该条目,写和删被拒绝,且与用户授权了什么无关;
- 文档建议的典型用途:缓存的 access token 等"绝不应被其他应用看到"的值——用户在授权提示里看不到你存储里有什么,因此授权不等于暴露内容;
- 你自己的应用读写该条目不受影响;
- 对同一个 key不带该标志再次
set会使其恢复可共享,因为set替换的是整个条目。
验证写入结果
puter.kv.set()返回一个 Promise:键值对创建成功或已有 key 的值更新成功时,resolve 为true。这是文档给出的成功判定条件,上面示例中success打印出的就是该值。
写入后,你的应用可以从自己的存储读回验证:
<script> (async () => { // 用自己的应用身份读回(私有条目对本应用正常可读) const name = await puter.kv.get('name'); const accessToken = await puter.kv.get('accessToken'); puter.print(`name is: ${name}`); puter.print(`accessToken is: ${accessToken}`); // 列出本应用的全部 key,确认批量写入都已落库 const keys = await puter.kv.list(); puter.print(`Keys are: ${keys}`); })(); </script>其中puter.kv.get(key)返回该 key 的 value,key 不存在时 resolve 为undefined(见 get.md);puter.kv.list()返回当前应用在本用户存储中的全部 key,按字典序排序,无 key 时返回空数组(见 list.md)。
至于"其他应用读不到"这一点,文档描述的是行为保证而非需要你在单应用内验证的输出现象:其他应用发起读请求会返回空、列表省略该条目、写删被拒。若要实际观察,需要按 appData.md 的流程由第二个应用通过puter.perms.request('appData', { app, scopes })获取授权后再读——这在单应用环境里不构成验证步骤。
限制与边界
- 不能对别的应用的数据设置
disableSharing:后端在检测到disableSharing与跨应用写入(appUuid)同时出现时会抛出错误kv: \disableSharing` cannot be set on another app's data`,实现见 KVStoreDriver.ts。该选项只作用于你自己应用的存储; - 批量中每条 entry 独立携带
expireAt,而disableSharing是整批级别:一批要么全部私有,要么全部共享(按尾随 options 是否传入判断); - 想撤销私有状态时,不带
disableSharing重写该 key 即可,但注意set是整体替换而非合并; - key/value 的大小上限、数字精度钳制行为见上文"批量写入的调用形式"一节,单条和批量规则一致。
下一步
- 需要给条目设置过期时间时,在单条或批量 item 中传
expireAt(时间戳秒数),或使用 puter.kv.expire() / puter.kv.expireAt(); - 完整的 KV 操作集合(set、get、incr、decr、add、remove、update、del、expire、list、flush)汇总在 Key-Value Store 文档。
【免费下载链接】puter🌐 The Internet Computer! Free, Open-Source, and Self-Hostable.项目地址: https://gitcode.com/GitHub_Trending/pu/puter
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考