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
- Access the preview server over plain TCP/HTTP (localhost:port) so the socket has a remoteAddress
- Update @sveltejs/kit to the latest version for improved preview handling
- Bypass `vite preview` and test the built app with `node build` (adapter-node) instead
- 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
- Access preview via http://localhost:<port> over TCP
- Avoid socket/IPC-based proxies in front of vite preview
- Prefer adapter-node (node build) for production-like testing
- Keep @sveltejs/kit updated
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
- Address header was specified with ${env_prefix + 'ADDRESS_HE
- ${env_prefix + 'XFF_DEPTH'} must be a positive integer
- ${env_prefix + 'XFF_DEPTH'} is ${xff_depth}, but only found
- Multiple values provided for ${name} header where only one e
- The ${protocol_header} header specified ${protocol} which is
AI-assisted analysis of sveltejs/kit@03f1687fe6 (2026-09-02).
Data as JSON: /api/errors/89934c0fad8d2123.
Report an issue: GitHub.