news 2026/9/12 14:16:51

如何用 puter.kv.set() 批量写入并用 disableSharing 标记私有条目?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 puter.kv.set() 批量写入并用 disableSharing 标记私有条目?

如何用 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 KBvalue可以是 String、Number、Boolean、Object 或 Array,对象和数组原样存取,最大400 KB
  • value 中的每个数字(包括嵌套在对象/数组里的)必须在±9,007,199,254,740,991Number.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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 14:16:34

SadTalker 安装教程:3 条命令跑通第一段口型视频

SadTalker 安装教程&#xff1a;3 条命令跑通第一段口型视频 【免费下载链接】SadTalker [CVPR 2023] SadTalker&#xff1a;Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation 项目地址: https://gitcode.com/GitH…

作者头像 李华
网站建设 2026/9/12 14:11:35

深入理解面向对象编程:从基础到实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 14:09:58

Django开箱即用的RBAC权限系统:从模型到菜单的完整实现

简介&#xff1a;基于Django的开箱即用RBAC&#xff08;基于角色的权限管理&#xff09;系统&#xff0c;面向Web开发初学者、相关专业在校生以及需要快速搭建权限模块的开发者&#xff0c;可有效解决角色、用户、权限三者间的授权与校验落地问题。资源共34个文件&#xff0c;以…

作者头像 李华
网站建设 2026/9/12 14:09:23

避开桌面软件,3款Web端开源ER图工具实测:选型与实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 14:08:40

LunaTranslator 使用指南:把日文游戏实时翻译成中文的完整步骤

LunaTranslator 使用指南&#xff1a;把日文游戏实时翻译成中文的完整步骤 【免费下载链接】LunaTranslator 视觉小说翻译器 / Visual Novel Translator 项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator LunaTranslator 是一款免费的视觉小说翻译工具…

作者头像 李华
网站建设 2026/9/12 14:07:37

aarch64嵌入式Qt静态交叉编译部署手册

做aarch64嵌入式开发这几年&#xff0c;我见过的Qt部署翻车现场不算少。最早在RK3399板子上调一个Qt应用&#xff0c;程序编出来了&#xff0c;目标板上缺libQt5Core.so.5&#xff0c;用NFS挂载把宿主机的库共享过去&#xff0c;结果板子glibc偏老&#xff0c;库一加载直接段错…

作者头像 李华