{"record":{"id":"89934c0fad8d2123","repo":"sveltejs/kit","slug":"could-not-determine-clientaddress-89934c","errorCode":null,"errorMessage":"Could not determine clientAddress","messagePattern":"Could not determine clientAddress","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/kit/src/exports/vite/preview/index.js","lineNumber":220,"sourceCode":"\t\t);\n\n\t\t// SSR\n\t\tvite.middlewares.use(async (req, res) => {\n\t\t\tconst host = req.headers[':authority'] || req.headers.host;\n\n\t\t\tconst request = (svelte_config.adapter?.vite?.getRequest ?? getRequest)({\n\t\t\t\tbase: `${protocol}://${host}`,\n\t\t\t\trequest: req,\n\t\t\t\tresponse: res\n\t\t\t});\n\n\t\t\t(svelte_config.adapter?.vite?.setResponse ?? setResponse)(\n\t\t\t\tres,\n\t\t\t\tawait server.respond(request, {\n\t\t\t\t\tgetClientAddress: () => {\n\t\t\t\t\t\tconst { remoteAddress } = req.socket;\n\t\t\t\t\t\tif (remoteAddress) return remoteAddress;\n\t\t\t\t\t\tthrow new Error('Could not determine clientAddress');\n\t\t\t\t\t},\n\t\t\t\t\tread: (file) => {\n\t\t\t\t\t\tif (file in manifest.server_assets) {\n\t\t\t\t\t\t\treturn fs.readFileSync(join(dir, file));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn fs.readFileSync(join(svelte_config.files.assets, file));\n\t\t\t\t\t},\n\t\t\t\t\temulator\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\t};\n}\n\n/**\n * @param {string} dir\n * @returns {NextHandleFunction}","sourceCodeStart":202,"sourceCodeEnd":238,"githubUrl":"https://github.com/sveltejs/kit/blob/03f1687fe612ce3d2d9131139b5b188d9cf90c64/packages/kit/src/exports/vite/preview/index.js#L202-L238","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\nvite preview --host 0.0.0.0 // accessed via internal socket proxy\n// after\nnode build // or plain http://localhost:4173 access","handlingStrategy":"try-catch","validationCode":"// before invoking preview handler\nif (req.socket && typeof req.socket.remoteAddress !== 'string') {\n  throw new Error('Preview requires TCP connections with a remote address');\n}","typeGuard":"const hasClientAddress = (socket) => typeof socket?.remoteAddress === 'string' && socket.remoteAddress.length > 0;","tryCatchPattern":"try {\n  await server.respond(request, { getClientAddress: () => req.socket.remoteAddress });\n} catch (e) {\n  if (e.message === 'Could not determine clientAddress') {\n    res.statusCode = 500;\n    res.end('Preview must be accessed over TCP/HTTP');\n  } else throw e;\n}","preventionTips":["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"],"tags":["preview","node","http","client-address"],"backgroundTag":"client-address-unavailable","analyzedSha":"03f1687fe612ce3d2d9131139b5b188d9cf90c64","analyzedAt":"2026-09-02T02:01:50.504Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T06:17:21.866Z"}