fix: improve Redis initialization and add debugging for metadata fetch

- Support both KV_* and UPSTASH_* env var names for Redis
- Add error handling for Redis get operations
- Add console logging to track cache hits/misses and gateway fetches
- Fix syntax error in background refresh trigger

This will help diagnose why article metadata isn't being returned correctly.
This commit is contained in:
Gigi
2025-11-07 19:05:25 +01:00
parent 70ac7dce95
commit 56547b3526
2 changed files with 27 additions and 5 deletions

View File

@@ -21,25 +21,35 @@ export default async function handler(req: VercelRequest, res: VercelResponse) {
}
// Try Redis cache first
let meta = await getArticleMeta(naddr)
let meta = await getArticleMeta(naddr).catch((err) => {
console.error('Failed to get article meta from Redis:', err)
return null
})
let cacheMaxAge = 86400
if (!meta) {
// Cache miss: try gateway (fast HTTP, no WebSockets)
console.log(`Cache miss for ${naddr}, trying gateway...`)
meta = await fetchArticleMetadataViaGateway(naddr)
if (meta) {
console.log(`Gateway found metadata for ${naddr}:`, { title: meta.title, summary: meta.summary?.substring(0, 50) })
// Gateway found metadata: store it and use it
await setArticleMeta(naddr, meta).catch((err) => {
console.error('Failed to cache gateway metadata:', err)
})
cacheMaxAge = 86400
} else {
console.log(`Gateway failed for ${naddr}, using default fallback`)
// Gateway failed: use default fallback
cacheMaxAge = 300
}
} else {
console.log(`Cache hit for ${naddr}:`, { title: meta.title, summary: meta.summary?.substring(0, 50) })
}
// Trigger background refresh (fire-and-forget)
// Trigger background refresh on cache miss (fire-and-forget)
if (!meta) {
const secret = process.env.OG_REFRESH_SECRET || ''
const origin = req.headers['x-forwarded-proto'] && req.headers['x-forwarded-host']
? `${req.headers['x-forwarded-proto']}://${req.headers['x-forwarded-host']}`

View File

@@ -1,8 +1,20 @@
import { Redis } from '@upstash/redis'
const redisWrite = Redis.fromEnv()
const redisRead = process.env.KV_REST_API_READ_ONLY_TOKEN && process.env.KV_REST_API_URL
? new Redis({ url: process.env.KV_REST_API_URL!, token: process.env.KV_REST_API_READ_ONLY_TOKEN! })
// Support both KV_* and UPSTASH_* env var names
const redisUrl = process.env.UPSTASH_REDIS_REST_URL || process.env.KV_REST_API_URL
const redisToken = process.env.UPSTASH_REDIS_REST_TOKEN || process.env.KV_REST_API_TOKEN
const readOnlyToken = process.env.KV_REST_API_READ_ONLY_TOKEN
if (!redisUrl || !redisToken) {
console.error('Missing Redis credentials: UPSTASH_REDIS_REST_URL/UPSTASH_REDIS_REST_TOKEN or KV_REST_API_URL/KV_REST_API_TOKEN')
}
const redisWrite = redisUrl && redisToken
? new Redis({ url: redisUrl, token: redisToken })
: Redis.fromEnv() // Fallback to fromEnv() if explicit vars not set
const redisRead = readOnlyToken && redisUrl
? new Redis({ url: redisUrl, token: readOnlyToken })
: redisWrite
const keyOf = (naddr: string) => `og:${naddr}`