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

  1. Guard the call with `if (event.isSubRequest || event.url.pathname === '/[fallback]' || event.prerendering) ...` and skip reading clientAddress during prerendering
  2. Check `event.prerendering?.fallback` (or simply `event.prerendering`) before accessing getClientAddress and supply a placeholder value
  3. Disable fallback generation (set `fallback: undefined` in adapter-static options) if the endpoint genuinely needs client data
  4. 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

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


AI-assisted analysis of sveltejs/kit@03f1687fe6 (2026-09-02). Data as JSON: /api/errors/bec584b15519aeb3. Report an issue: GitHub.