{"record":{"id":"566597465b1c4a04","repo":"withastro/astro","slug":"staticclientaddressnotavailable-566597","errorCode":"StaticClientAddressNotAvailable","errorMessage":"`Astro.clientAddress` is only available on pages that are server-rendered.","messagePattern":"`Astro\\.clientAddress` is only available on pages that are server-rendered\\.","errorType":"exception","errorClass":"AstroError","httpStatus":null,"severity":"error","filePath":"packages/astro/src/core/middleware/index.ts","lineNumber":110,"sourceCode":"\t\tisPrerendered: false,\n\t\tget preferredLocale(): string | undefined {\n\t\t\treturn (preferredLocale ??= computePreferredLocale(request, userDefinedLocales));\n\t\t},\n\t\tget preferredLocaleList(): string[] | undefined {\n\t\t\treturn (preferredLocaleList ??= computePreferredLocaleList(request, userDefinedLocales));\n\t\t},\n\t\tget currentLocale(): string | undefined {\n\t\t\treturn (currentLocale ??= computeCurrentLocale(route, userDefinedLocales, defaultLocale));\n\t\t},\n\t\turl,\n\t\tget originPathname() {\n\t\t\treturn getOriginPathname(request);\n\t\t},\n\t\tget clientAddress() {\n\t\t\tif (clientAddress) {\n\t\t\t\treturn clientAddress;\n\t\t\t}\n\t\t\tthrow new AstroError(AstroErrorData.StaticClientAddressNotAvailable);\n\t\t},\n\t\tget locals() {\n\t\t\tif (typeof locals !== 'object') {\n\t\t\t\tthrow new AstroError(AstroErrorData.LocalsNotAnObject);\n\t\t\t}\n\t\t\treturn locals;\n\t\t},\n\t\tset locals(_) {\n\t\t\tthrow new AstroError(AstroErrorData.LocalsReassigned);\n\t\t},\n\t\tsession: undefined,\n\t\tcache: new DisabledAstroCache(),\n\t\tcsp: undefined,\n\t\tlogger: {\n\t\t\tinfo() {},\n\t\t\twarn() {},\n\t\t\terror() {},\n\t\t},","sourceCodeStart":92,"sourceCodeEnd":128,"githubUrl":"https://github.com/withastro/astro/blob/d081033d5fe8e8a68c4bbbad4af9d2deb9c74bca/packages/astro/src/core/middleware/index.ts#L92-L128","documentation":"Thrown by the clientAddress getter on the APIContext returned from createContext (used in dev/middleware contexts). When no clientAddress was passed to the context, reading it is meaningless, so StaticClientAddressNotAvailable is thrown. Unlike the route-aware getter, this context has no prerender/adapter logic, only a presence check.","triggerScenarios":"Reading context.clientAddress from middleware or an APIContext that was created without a clientAddress argument (e.g. during dev, tests, or an SSG build). The getter throws when the local clientAddress variable is falsy.","commonSituations":"Accessing clientAddress inside middleware that also runs during prerender/dev when no address exists; SSR middleware in a static-output project; reading clientAddress before an adapter is configured.","solutions":["Only read clientAddress in contexts where it is provided (server-rendered requests with a supporting adapter).","Guard with an adapter check or feature flag before reading clientAddress in middleware.","Fall back to request headers when clientAddress is unavailable."],"exampleFix":"// before\nexport const onRequest = (ctx, next) => {\n  log(ctx.clientAddress);\n  return next();\n};\n\n// after\nexport const onRequest = (ctx, next) => {\n  log(ctx.clientAddress ?? ctx.request.headers.get('x-forwarded-for'));\n  return next();\n};","handlingStrategy":"validation","validationCode":"// In middleware, guard clientAddress access.\nexport const onRequest = (ctx, next) => {\n  const ip = ctx.clientAddress ?? ctx.request.headers.get('x-forwarded-for');\n  return next();\n};","typeGuard":"function hasClientAddress(ctx: { clientAddress?: string }): boolean {\n  return typeof ctx.clientAddress === 'string' && ctx.clientAddress.length > 0;\n}","tryCatchPattern":"try {\n  ip = ctx.clientAddress;\n} catch (e) {\n  if (e instanceof Error && /server-rendered/i.test(e.message)) {\n    ip = ctx.request.headers.get('x-forwarded-for') ?? undefined;\n  } else throw e;\n}","preventionTips":["Do not assume clientAddress exists in middleware; provide a fallback.","Skip IP logic in prerendered/static contexts.","Test middleware with and without an adapter."],"tags":["clientaddress","middleware","context","ssr"],"backgroundTag":null,"analyzedSha":"d081033d5fe8e8a68c4bbbad4af9d2deb9c74bca","analyzedAt":"2026-08-12T13:37:29.035Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}