关于 spacetimedb-procedures
面向 SpacetimeDB 开发者的技能,介绍如何编写非 reducer 事务入口的 procedure。内容涵盖语言用法、事务处理,以及执行外部 HTTP 请求时的注意事项。
主要功能
- 01多种语言的 procedure 模式
- 02返回值与数据库访问指引
- 03事务安全的数据库写入
- 04外部 HTTP 与密钥处理指引
适用场景
- 01选择 reducer 或 procedure
- 02实现 SpacetimeDB procedure
- 03获取外部数据后写入数据库
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ danmossa/ spacetimedb-skills --skill spacetimedb-procedures安装后在 Claude Code 中输入/spacetimedb-procedures确认已加载。
附带文件references/functions-procedures.md
详细介绍
将此技能用于 reducer 事务入口点以外的过程和服务端工作。
核心过程模式
过程是可以返回值并执行 reducer 不应执行的工作的服务端函数,包括外部 HTTP 调用。对于由客户端调用的事务性状态变更,请使用 reducer;当调用方需要返回值或函数必须执行外部工作时,请使用过程。
TypeScript 过程形式:
export const add_two_numbers = spacetimedb.procedure(
{ lhs: t.u32(), rhs: t.u32() },
t.u64(),
(_ctx, { lhs, rhs }) => BigInt(lhs) + BigInt(rhs),
);
语言说明:
- TypeScript 过程返回声明的
t.*类型,并接收(ctx, args)。 - C# 过程尚不稳定;请添加
#pragma warning disable STDB_UNSTABLE并使用[SpacetimeDB.Procedure]。 - Rust 过程尚不稳定;请启用
unstable特性,并使用#[spacetimedb::procedure]和&mut ProcedureContext。 - C++ 过程尚不稳定;请在包含头文件前定义
SPACETIMEDB_UNSTABLE_FEATURES。
事务和 HTTP
- 过程不会自动在事务中运行。
- 请使用相应语言的事务辅助函数来包装数据库写入,例如 TypeScript 的
ctx.withTx(...)。 - 发出 HTTP 请求时,不要让事务保持开启状态。先获取数据,然后开启一个短事务来写入结果或调用 reducer 逻辑。
- 请明确处理外部 API 密钥和故障;不要记录可能包含私有数据的令牌或响应正文。
- 如果过程调用 reducer 逻辑,请确保共享的状态变更逻辑可在事务中安全运行,并且可从 reducer 上下文复用。
参考索引
| 需求 | 打开 |
|---|---|
| 过程定义、数据库访问、HTTP、reducer 调用和返回值 | references/functions-procedures.md |
指南
- 对于由客户端调用的事务性状态变更,请使用 reducer;当参考资料表明适合返回值或执行外部工作时,请使用过程。
- 明确处理 HTTP 请求和外部 API,包括密钥、故障和运行时预期。
- 根据需要,将表变更的详细信息交由 spacetimedb-reducers 或 spacetimedb-tables 处理。
评论
支持 Markdown