Skip to main content

KV Store Usage Example

Practical examples of using the built-in key-value store.

Session Management

export default async function handler(req, res) {
const sessionId = req.cookies.sessionId || crypto.randomUUID()
const sessionKey = `session:${sessionId}`

let session = (await kv.get(sessionKey)) || {
id: sessionId,
createdAt: Date.now(),
data: {}
}

session.lastAccess = Date.now()
session.visits = (session.visits || 0) + 1

await kv.set(sessionKey, session, 3600)

res.cookie('sessionId', sessionId, { httpOnly: true, maxAge: 3600000 })
res.json({
success: true,
session: {
id: session.id,
visits: session.visits,
createdAt: new Date(session.createdAt).toISOString(),
lastAccess: new Date(session.lastAccess).toISOString()
}
})
}

Rate Limiting

export default async function handler(req, res) {
const identifier = req.ip || req.headers['x-forwarded-for']
const rateLimitKey = `ratelimit:${identifier}`
const limit = 10
const windowSeconds = 60

const current = (await kv.get(rateLimitKey)) || 0

if (current >= limit) {
return res.status(429).json({ error: 'Too many requests', retryAfter: windowSeconds })
}

await kv.set(rateLimitKey, current + 1, windowSeconds)
res.setHeader('X-RateLimit-Limit', limit)
res.setHeader('X-RateLimit-Remaining', limit - current - 1)
res.json({ success: true, requestsRemaining: limit - current - 1 })
}