Deno KV 監看
在 Github 上編輯
警告:這是一個不穩定的 API,隨時可能變更或移除。
Deno KV watch 允許您偵測 KV 資料庫的變更,讓您更容易建構即時應用程式、新聞摘要、聊天等。
開啟預設資料庫
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://deno-docs.dev.org.tw/examples/scripts/kv_watch.ts