{"record":{"id":"1f2a2dd6d2ad0ca6","repo":"sveltejs/kit","slug":"new-handledhttperror-server-data-node-error-ret","errorCode":null,"errorMessage":"new HandledHttpError(server_data_node.error) — rethrows server-provided error object","messagePattern":"new HandledHttpError\\(server_data_node\\.error\\) — rethrows server-provided error object","errorType":"http","errorClass":"HandledHttpError","httpStatus":null,"severity":"error","filePath":"packages/kit/src/runtime/client/client.js","lineNumber":1519,"sourceCode":"\t\t// reuse data from previous load if it's still valid\n\t\tconst valid =\n\t\t\t(!server_data_node || server_data_node.type === 'skip') &&\n\t\t\tloader[1] === previous?.loader &&\n\t\t\t!has_changed(\n\t\t\t\tparent_changed,\n\t\t\t\troute_changed,\n\t\t\t\turl_changed,\n\t\t\t\tsearch_params_changed,\n\t\t\t\tprevious.universal?.uses,\n\t\t\t\tparams\n\t\t\t);\n\t\tif (valid) return previous;\n\n\t\tparent_changed = true;\n\n\t\tif (server_data_node?.type === 'error') {\n\t\t\t// rethrow and catch below\n\t\t\tthrow new HandledHttpError(server_data_node.error);\n\t\t}\n\n\t\treturn load_node({\n\t\t\tloader: loader[1],\n\t\t\turl,\n\t\t\tparams,\n\t\t\troute,\n\t\t\tparent: async () => {\n\t\t\t\tconst data = {};\n\t\t\t\tfor (let j = 0; j < i; j += 1) {\n\t\t\t\t\tObject.assign(data, (await branch_promises[j])?.data);\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\t},\n\t\t\tserver_data_node: create_data_node(\n\t\t\t\t// server_data_node is undefined if it wasn't reloaded from the server;\n\t\t\t\t// and if current loader uses server data, we want to reuse previous data.\n\t\t\t\tserver_data_node === undefined && loader[0] ? { type: 'skip' } : (server_data_node ?? null),","sourceCodeStart":1501,"sourceCodeEnd":1537,"githubUrl":"https://github.com/sveltejs/kit/blob/03f1687fe612ce3d2d9131139b5b188d9cf90c64/packages/kit/src/runtime/client/client.js#L1501-L1537","documentation":"During client-side navigation, if a parent branch's data previously came from a server error node and the parent changed, the client re-throws the server-provided error object as `HandledHttpError` so it flows through the normal error-handling path (nearest `+error.svelte` boundary) instead of re-running the child `load`. It is an internal rethrow of an error already produced on the server.","triggerScenarios":"Navigating to a route where the server returned `{ type: 'error' }` in the server data node for a parent branch and a subsequent navigation finds `parent_changed` — the stored server error is rethrown for handling.","commonSituations":"A parent `+layout.server.js` load fails (e.g. auth check) and child routes attempt navigation; handling server errors from a remote form/load result in an error boundary.","solutions":["Handle the error in the nearest `+error.svelte` boundary; access it via `page.error` / `error` state","Fix the root cause on the server so the parent load no longer errors (e.g. valid auth, correct data)","In `handleError` hooks, log and shape the server error so the client displays something meaningful"],"exampleFix":"// before\n// no error boundary -> unhandled HandledHttpError on navigation\n// after\n// src/routes/+error.svelte\n<script>\nimport { page } from '$app/state';\n</script>\n<p>{page.error?.message}</p>","handlingStrategy":"try-catch","validationCode":"// before navigating, check whether the server data indicated an error\nif (branchServerData?.type === 'error') {\n  handleError(branchServerData.error);\n}","typeGuard":"const isServerErrorNode = (node) => node?.type === 'error' && node.error != null;","tryCatchPattern":"try {\n  await navigate(url, { replaceState: false });\n} catch (e) {\n  if (e instanceof HandledHttpError || e?.status != null) {\n    renderErrorBoundary(e);\n  } else throw e;\n}","preventionTips":["Always ship a root +error.svelte so server errors have a boundary","Fix parent layout load failures (auth/data) that propagate as server error nodes","Log server errors via handleError hook to surface root causes early"],"tags":["client-navigation","server-error","error-boundary"],"backgroundTag":"server-load-error","analyzedSha":"03f1687fe612ce3d2d9131139b5b188d9cf90c64","analyzedAt":"2026-09-02T02:01:50.504Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T06:17:21.866Z"}