[ PROMPT_NODE_24142 ]
Kv 常见陷阱
[ SKILL_DOCUMENTATION ]
# KV 常见问题与故障排除
## 常见错误
### “写入后读取陈旧数据”
**原因:** 最终一致性意味着写入操作在其他区域可能不会立即生效
**解决方案:** 不要写入后立即读取;在不读取的情况下返回确认,或者使用你刚刚写入的本地值。写入在同一位置立即生效,全球 ≤60秒
typescript
// ❌ 错误:写入后立即读取
await env.KV.put("key", "value");
const value = await env.KV.get("key"); // 在其他区域可能为 null!
// ✅ 正确:使用你刚刚写入的值
const newValue = "value";
await env.KV.put("key", newValue);
return new Response(newValue); // 不要重新读取
### “并发写入 429 速率限制”
**原因:** 对同一键的多次并发写入超过了 1 次写入/秒的限制
**解决方案:** 使用顺序写入、为并发操作使用唯一键,或实现带指数退避的重试机制
typescript
async function putWithRetry(
kv: KVNamespace,
key: string,
value: string,
maxAttempts = 5
): Promise {
let delay = 1000;
for (let i = 0; i setTimeout(r, delay));
delay *= 2; // 指数退避
} else {
throw err;
}
}
}
}
### “低效的多次获取”
**原因:** 进行多次单独的 get() 调用而不是批量操作
**解决方案:** 使用包含键数组的批量获取:`env.USERS.get(["user:1", "user:2", "user:3"])` 以减少为 1 次操作
### “空引用错误”
**原因:** 在键不存在时未检查 null 就直接使用值
**解决方案:** 始终处理 null 返回值 - KV 对缺失的键返回 `null`,而不是 undefined
typescript
// ❌ 错误:假设值存在
const config = await env.KV.get("config", "json");
return config.theme; // 如果为 null 则抛出 TypeError!
// ✅ 正确:空值检查
const config = await env.KV.get("config", "json");
return config?.theme ?? "default";
// ✅ 正确:提前返回
const config = await env.KV.get("config", "json");
if (!config) return new Response("Not found", { status: 404 });
return new Response(config.theme);
### “负查找缓存”
**原因:** 不存在的键会被缓存为“未找到”,最长可达 60 秒
**解决方案:** 检查后创建键在 60 秒内可能不会生效