{"record":{"id":"bec584b15519aeb3","repo":"sveltejs/kit","slug":"cannot-read-clientaddress-during-prerendering","errorCode":null,"errorMessage":"Cannot read clientAddress during prerendering","messagePattern":"Cannot read clientAddress during prerendering","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/kit/src/core/postbuild/fallback.js","lineNumber":37,"sourceCode":"\tconst server_root = join(out_dir, 'output');\n\n\t/** @type {import('types').ServerInternalModule} */\n\tconst { set_building } = await import(pathToFileURL(`${server_root}/server/internal.js`).href);\n\n\t/** @type {import('types').ServerModule} */\n\tconst { Server } = await import(pathToFileURL(`${server_root}/server/index.js`).href);\n\n\t/** @type {import('types').SSRManifest} */\n\tconst manifest = (await import(pathToFileURL(manifest_path).href)).manifest;\n\n\tset_building();\n\n\tconst server = new Server(manifest);\n\tawait server.init({ env });\n\n\tconst response = await server.respond(new Request(origin + '/[fallback]'), {\n\t\tgetClientAddress: () => {\n\t\t\tthrow new Error('Cannot read clientAddress during prerendering');\n\t\t},\n\t\tprerendering: {\n\t\t\tfallback: true,\n\t\t\tdependencies: new Map(),\n\t\t\tremote_responses: new Map(),\n\t\t\tresolved_route_ids: new Set()\n\t\t},\n\t\tread: (file) => readFileSync(join(assets, file))\n\t});\n\n\tif (response.ok) {\n\t\treturn await response.text();\n\t}\n\n\tthrow stackless('Could not create a fallback page');\n}\n","sourceCodeStart":19,"sourceCodeEnd":54,"githubUrl":"https://github.com/sveltejs/kit/blob/03f1687fe612ce3d2d9131139b5b188d9cf90c64/packages/kit/src/core/postbuild/fallback.js#L19-L54","documentation":"During fallback-page generation SvelteKit creates a Server whose getClientAddress stub deliberately throws. If any code in your app (e.g. +server.js handlers, hooks, load functions) calls event.getClientAddress() while the prerender fallback page is being rendered, this error surfaces. Reading the client IP is meaningless for a synthetic prerendered request because no real client is connected.","triggerScenarios":"Calling event.getClientAddress() (directly or via a helper) inside a +server.js endpoint, handle hook, or remote function that executes during `prerender = true` fallback generation (adapter-static with fallback page).","commonSituations":"Logging or rate-limiting by IP in src/hooks.server.js; endpoints that read clientAddress for geolocation; apps switching from adapter-node to adapter-static with a fallback page.","solutions":["Guard the call with `if (event.isSubRequest || event.url.pathname === '/[fallback]' || event.prerendering) ...` and skip reading clientAddress during prerendering","Check `event.prerendering?.fallback` (or simply `event.prerendering`) before accessing getClientAddress and supply a placeholder value","Disable fallback generation (set `fallback: undefined` in adapter-static options) if the endpoint genuinely needs client data","Move IP-dependent logic out of code paths that run at build/prerender time"],"exampleFix":"// before\nexport const GET = (event) => {\n  const ip = event.getClientAddress();\n  return json({ ip });\n};\n\n// after\nexport const GET = (event) => {\n  if (event.prerendering) return json({ ip: null });\n  const ip = event.getClientAddress();\n  return json({ ip });\n};","handlingStrategy":"validation","validationCode":"function canReadClientAddress(event) {\n  return !event.prerendering; // prerendered requests have no client\n}\n// usage: const ip = canReadClientAddress(event) ? event.getClientAddress() : null;","typeGuard":"function isPrerendering(event) {\n  return typeof event.prerendering !== 'undefined';\n}","tryCatchPattern":"let ip;\ntry {\n  ip = event.getClientAddress();\n} catch {\n  ip = null; // prerendering context\n}","preventionTips":["Always gate getClientAddress behind an `event.prerendering` check in shared hooks","Never log or persist client IPs in code reachable at build time","Test builds with prerender enabled before switching to adapter-static"],"tags":["prerender","adapter-static","client-address","build-time"],"backgroundTag":"client-address-during-prerendering","analyzedSha":"03f1687fe612ce3d2d9131139b5b188d9cf90c64","analyzedAt":"2026-09-02T02:01:50.504Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T06:17:21.866Z"}