sveltejs/kit · error · Error

Could not determine clientAddress

Error message

Could not determine clientAddress

What it means

SvelteKit's preview server needs the client's IP address to populate RequestEvent.getClientAddress(). It reads req.socket.remoteAddress from the incoming Node HTTP request; when that is undefined (no remote address on the socket), it throws because it cannot fabricate one.

Source

Thrown at packages/kit/src/exports/vite/preview/index.js:220

		);

		// SSR
		vite.middlewares.use(async (req, res) => {
			const host = req.headers[':authority'] || req.headers.host;

			const request = (svelte_config.adapter?.vite?.getRequest ?? getRequest)({
				base: `${protocol}://${host}`,
				request: req,
				response: res
			});

			(svelte_config.adapter?.vite?.setResponse ?? setResponse)(
				res,
				await server.respond(request, {
					getClientAddress: () => {
						const { remoteAddress } = req.socket;
						if (remoteAddress) return remoteAddress;
						throw new Error('Could not determine clientAddress');
					},
					read: (file) => {
						if (file in manifest.server_assets) {
							return fs.readFileSync(join(dir, file));
						}

						return fs.readFileSync(join(svelte_config.files.assets, file));
					},
					emulator
				})
			);
		});
	};
}

/**
 * @param {string} dir
 * @returns {NextHandleFunction}

View on GitHub (pinned to 03f1687fe6)

Solutions

  1. Access the preview server over plain TCP/HTTP (localhost:port) so the socket has a remoteAddress
  2. Update @sveltejs/kit to the latest version for improved preview handling
  3. Bypass `vite preview` and test the built app with `node build` (adapter-node) instead
  4. If proxying, ensure the proxy uses TCP and passes through so socket.remoteAddress is set

Example fix

// before
vite preview --host 0.0.0.0 // accessed via internal socket proxy
// after
node build // or plain http://localhost:4173 access
Defensive patterns

Strategy: try-catch

Validate before calling

// before invoking preview handler
if (req.socket && typeof req.socket.remoteAddress !== 'string') {
  throw new Error('Preview requires TCP connections with a remote address');
}

Type guard

const hasClientAddress = (socket) => typeof socket?.remoteAddress === 'string' && socket.remoteAddress.length > 0;

Try / catch

try {
  await server.respond(request, { getClientAddress: () => req.socket.remoteAddress });
} catch (e) {
  if (e.message === 'Could not determine clientAddress') {
    res.statusCode = 500;
    res.end('Preview must be accessed over TCP/HTTP');
  } else throw e;
}

Prevention

When it happens

Trigger: Calling svelte-kit preview (or vite preview with the kit plugin) while the incoming request's socket has no remoteAddress — e.g. requests arriving over a Unix socket, certain internal/IPC transports, or exotic proxies.

Common situations: Previewing behind an unusual reverse proxy or socket-based server, running preview in sandboxed/containerized environments that connect via non-TCP sockets, or custom server wiring reusing the preview handler.

Related errors


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