Sink/server/api/link/search.get.ts
ccbikai 465aa3292a fix: Increases KV list limit for better data retrieval
Expands the limit of the KV.list call from 1 to 1000.

This enhancement allows for more efficient data retrieval, reducing the number of requests needed to fetch all relevant entries.

Improves performance in scenarios with a large number of links.
2024-12-23 21:09:00 +08:00

73 lines
1.9 KiB
TypeScript

interface Link {
slug: string
url: string
comment?: string
}
export default eventHandler(async (event) => {
const { cloudflare } = event.context
const { KV } = cloudflare.env
const list: Link[] = []
let finalCursor: string | undefined
try {
while (true) {
const { keys, list_complete, cursor } = await KV.list({
prefix: `link:`,
limit: 1000,
cursor: finalCursor,
})
finalCursor = cursor
if (Array.isArray(keys)) {
for (const key of keys) {
try {
if (key.metadata?.url) {
list.push({
slug: key.name.replace('link:', ''),
url: key.metadata.url,
comment: key.metadata.comment,
})
}
else {
// Forward compatible with links without metadata
const { metadata, value: link } = await KV.getWithMetadata(key.name, { type: 'json' })
if (link) {
list.push({
slug: key.name.replace('link:', ''),
url: link.url,
comment: link.comment,
})
await KV.put(key.name, JSON.stringify(link), {
expiration: metadata?.expiration,
metadata: {
...metadata,
url: link.url,
comment: link.comment,
},
})
}
}
}
catch (err) {
console.error(`Error processing key ${key.name}:`, err)
continue // Skip this key and continue with the next one
}
}
}
if (!keys || list_complete) {
break
}
}
return list
}
catch (err) {
console.error('Error fetching link list:', err)
throw createError({
statusCode: 500,
message: 'Failed to fetch link list',
})
}
})