sveltejs/kit · error
Cannot read clientAddress during prerendering
Error message
Cannot read clientAddress during prerendering
What it means
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.
Source
Thrown at packages/kit/src/core/postbuild/fallback.js:37
const server_root = join(out_dir, 'output');
/** @type {import('types').ServerInternalModule} */
const { set_building } = await import(pathToFileURL(`${server_root}/server/internal.js`).href);
/** @type {import('types').ServerModule} */
const { Server } = await import(pathToFileURL(`${server_root}/server/index.js`).href);
/** @type {import('types').SSRManifest} */
const manifest = (await import(pathToFileURL(manifest_path).href)).manifest;
set_building();
const server = new Server(manifest);
await server.init({ env });
const response = await server.respond(new Request(origin + '/[fallback]'), {
getClientAddress: () => {
throw new Error('Cannot read clientAddress during prerendering');
},
prerendering: {
fallback: true,
dependencies: new Map(),
remote_responses: new Map(),
resolved_route_ids: new Set()
},
read: (file) => readFileSync(join(assets, file))
});
if (response.ok) {
return await response.text();
}
throw stackless('Could not create a fallback page');
}
View on GitHub (pinned to 03f1687fe6)
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
Example fix
// before
export const GET = (event) => {
const ip = event.getClientAddress();
return json({ ip });
};
// after
export const GET = (event) => {
if (event.prerendering) return json({ ip: null });
const ip = event.getClientAddress();
return json({ ip });
}; Defensive patterns
Strategy: validation
Validate before calling
function canReadClientAddress(event) {
return !event.prerendering; // prerendered requests have no client
}
// usage: const ip = canReadClientAddress(event) ? event.getClientAddress() : null; Type guard
function isPrerendering(event) {
return typeof event.prerendering !== 'undefined';
} Try / catch
let ip;
try {
ip = event.getClientAddress();
} catch {
ip = null; // prerendering context
} Prevention
- 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
When it happens
Trigger: 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).
Common situations: 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.
Related errors
- Cannot read clientAddress during prerendering
- Cannot prerender a root +server.js that returns a non-HTML r
- Could not create a fallback page
- Could not find prerendered page ${file} for route ${path}
- The _headers file should be placed in the project root rathe
AI-assisted analysis of sveltejs/kit@03f1687fe6 (2026-09-02).
Data as JSON: /api/errors/bec584b15519aeb3.
Report an issue: GitHub.