跳至主要内容

Deno KV 监控

警告:这是一个不稳定的 API,随时可能更改或移除。
Deno KV 监控允许您检测 KV 数据库中的更改,使构建实时应用程序、新闻提要、聊天等变得更加容易。

在 Github 上编辑
打开默认数据库
const kv = await Deno.openKv();
将 “counter” 值设置为 0,然后每秒增加一次。
await kv.set(["counter"], new Deno.KvU64(0n));
setInterval(() => {
  kv.atomic().sum(["counter"], 1n).commit();
}, 1000);
监听 “counter” 的更改并记录值。
for await (const [entry] of kv.watch([["counter"]])) {
  console.log(`Counter: ${entry.value}`);
}
您还可以从 kv.watch 创建一个流读取器,它返回一个 ReadableStream。
const stream = kv.watch([["counter"]]).getReader();
while (true) {
  const counter = await stream.read();
  if (counter.done) {
    break;
  }
  console.log(`Counter: ${counter.value[0].value}`);
}
要使用服务器发送事件,让我们创建一个使用流响应的服务器。每次检测到 “counter” 的更改时,都会将更新后的值发送给客户端。
Deno.serve((_req) => {
  const stream = kv.watch([["counter"]]).getReader();
  const body = new ReadableStream({
    async start(controller) {
      while (true) {
        if ((await stream.read()).done) {
          return;
        }
        const data = await kv.get(["counter"]);
        controller.enqueue(
          new TextEncoder().encode(`Counter: ${data.value}\n`),
        );
      }
    },
    cancel() {
      stream.cancel();
    },
  });
  return new Response(body, {
    headers: {
      "Content-Type": "text/event-stream",
    },
  });
});

使用 Deno CLI 在本地运行 此示例

deno run --unstable-kv https://docs.deno.org.cn/examples/kv-watch.ts