{"record":{"id":"e4a9117f99a8897b","repo":"sveltejs/kit","slug":"sveltekit-adapter-name-does-not-specify-get","errorCode":null,"errorMessage":"${__SVELTEKIT_ADAPTER_NAME__} does not specify getClientAddress. Please raise an issue","messagePattern":"(.+?) does not specify getClientAddress\\. Please raise an issue","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/kit/src/runtime/server/respond.js","lineNumber":193,"sourceCode":"\t}\n\n\t/** @type {Record<string, string>} */\n\tconst headers = {};\n\n\tconst { cookies, new_cookies, get_cookie_header, set_internal, set_trailing_slash } = get_cookies(\n\t\trequest,\n\t\turl\n\t);\n\n\t/** @type {import('@sveltejs/kit').RequestEvent} */\n\tconst event = {\n\t\tcookies,\n\t\t// @ts-expect-error `fetch` needs to be created after the `event` itself\n\t\tfetch: null,\n\t\tgetClientAddress:\n\t\t\tstate.getClientAddress ||\n\t\t\t(() => {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${__SVELTEKIT_ADAPTER_NAME__} does not specify getClientAddress. Please raise an issue`\n\t\t\t\t);\n\t\t\t}),\n\t\tlocals: {},\n\t\tparams: {},\n\t\tplatform: state.emulator?.platform\n\t\t\t? await state.emulator.platform({\n\t\t\t\t\tconfig: {},\n\t\t\t\t\tprerender: !!state.prerendering?.fallback\n\t\t\t\t})\n\t\t\t: state.platform,\n\t\trequest,\n\t\troute: { id: null },\n\t\tsetHeaders: (new_headers) => {\n\t\t\tif (DEV) {\n\t\t\t\tvalidateHeaders(new_headers);\n\t\t\t}\n","sourceCodeStart":175,"sourceCodeEnd":211,"githubUrl":"https://github.com/sveltejs/kit/blob/03f1687fe612ce3d2d9131139b5b188d9cf90c64/packages/kit/src/runtime/server/respond.js#L175-L211","documentation":"The `getClientAddress` event method is supplied by the server adapter via `state.getClientAddress`. When no adapter (or emulator) provides it, SvelteKit installs a fallback that throws, since the framework cannot know the platform-specific way to read the client IP.","triggerScenarios":"Code calls `event.getClientAddress()` in dev/prod where `state.getClientAddress` is undefined — typically running the built server output directly without its adapter runtime, or an adapter that does not implement getClientAddress.","commonSituations":"Accessing client IP in an environment without socket info (Cloudflare Workers-style runtimes, some emulators); executing server output with a plain Node harness instead of the adapter entry; relying on client IP behind proxies that don't forward it.","solutions":["Use an adapter that implements getClientAddress (e.g. adapter-node) or the adapter's platform object for IP","Read the IP from headers (e.g. `x-forwarded-for`) via `event.request.headers.get` instead","Guard the call and fall back to a placeholder when running outside a real server"],"exampleFix":"// before\nconst ip = event.getClientAddress();\n// after\nconst ip = event.request.headers.get('x-forwarded-for')?.split(',')[0] ?? 'unknown';","handlingStrategy":"fallback","validationCode":"// prefer forwarded headers when socket info is unavailable\nconst ip = request.headers.get('x-forwarded-for')?.split(',')[0]?.trim();","typeGuard":null,"tryCatchPattern":"let ip;\ntry {\n  ip = event.getClientAddress();\n} catch {\n  ip = event.request.headers.get('x-forwarded-for')?.split(',')[0] ?? 'unknown';\n}","preventionTips":["Don't assume getClientAddress exists in edge/serverless runtimes","Use adapter-provided platform/emulator data for IP when available","Trust only validated proxy headers"],"tags":["adapter","client-address","ssr"],"backgroundTag":"getclientaddress-unsupported-adapter","analyzedSha":"03f1687fe612ce3d2d9131139b5b188d9cf90c64","analyzedAt":"2026-09-02T02:01:50.504Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T06:17:21.866Z"}