Felix
Felix
NNuxt
Created by Felix on 2/10/2025 in #❓・help
Nitro useStorage use Brotli encoded json data
I have a Nuxt server route that should deliver a 400kb Brotli encoded JSON object. The json file is delivered over a custom server api route, because I need to set some custom headers for cache management with etags and set the correct content-type header. How do I read the file correctly and make it fetchable by the user? This is my current code:
export default defineEventHandler(async (event) => {
const metadata = await useStorage<{ hash: string }>('assets:server').getItem(`character-parts-metadata.json`)
if (!metadata)
return new Response('Failed to get metadata', { status: 500 })

const ifNoneMatch = getRequestHeader(event, 'if-none-match')
if (ifNoneMatch === metadata.hash) {
setResponseStatus(event, 304)
return null
}

const characterParts = await useStorage<string>('assets:server').getItem(`character-parts.json.br`)
if (!characterParts)
return new Response('Failed to get character parts', { status: 500 })

setHeaders(event, {
'Content-Type': 'application/json',
'Content-Encoding': 'br',
'ETag': metadata.hash,
'Cache-Control': 'no-cache',
})

return characterParts
})
export default defineEventHandler(async (event) => {
const metadata = await useStorage<{ hash: string }>('assets:server').getItem(`character-parts-metadata.json`)
if (!metadata)
return new Response('Failed to get metadata', { status: 500 })

const ifNoneMatch = getRequestHeader(event, 'if-none-match')
if (ifNoneMatch === metadata.hash) {
setResponseStatus(event, 304)
return null
}

const characterParts = await useStorage<string>('assets:server').getItem(`character-parts.json.br`)
if (!characterParts)
return new Response('Failed to get character parts', { status: 500 })

setHeaders(event, {
'Content-Type': 'application/json',
'Content-Encoding': 'br',
'ETag': metadata.hash,
'Cache-Control': 'no-cache',
})

return characterParts
})
5 replies