Skip to content

Commit 80418b0

Browse files
committed
Add better error messaging when getLoadContext isn't updated
1 parent bc43707 commit 80418b0

File tree

2 files changed

+43
-19
lines changed

2 files changed

+43
-19
lines changed

.changeset/sixty-tigers-poke.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"react-router": patch
3+
---
4+
5+
UNSTABLE: Add better error messaging when `getLoadContext` is not updated to return a `Map`"

packages/react-router/lib/server-runtime/server.ts

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,6 @@ export const createRequestHandler: CreateRequestHandlerFunction = (
9090
return async function requestHandler(request, initialContext) {
9191
_build = typeof build === "function" ? await build() : build;
9292

93-
let loadContext = _build.future.unstable_middleware
94-
? new unstable_RouterContextProvider(
95-
initialContext as unknown as unstable_InitialContext
96-
)
97-
: initialContext || {};
98-
9993
if (typeof build === "function") {
10094
let derived = derive(_build, mode);
10195
routes = derived.routes;
@@ -110,6 +104,44 @@ export const createRequestHandler: CreateRequestHandlerFunction = (
110104
errorHandler = derived.errorHandler;
111105
}
112106

107+
let params: RouteMatch<ServerRoute>["params"] = {};
108+
let loadContext: AppLoadContext | unstable_RouterContextProvider;
109+
110+
let handleError = (error: unknown) => {
111+
if (mode === ServerMode.Development) {
112+
getDevServerHooks()?.processRequestError?.(error);
113+
}
114+
115+
errorHandler(error, {
116+
context: loadContext,
117+
params,
118+
request,
119+
});
120+
};
121+
122+
if (_build.future.unstable_middleware) {
123+
if (initialContext == null) {
124+
loadContext = new unstable_RouterContextProvider();
125+
} else {
126+
try {
127+
loadContext = new unstable_RouterContextProvider(
128+
initialContext as unknown as unstable_InitialContext
129+
);
130+
} catch (e) {
131+
let error = new Error(
132+
"Unable to create initial `unstable_RouterContextProvider` instance. " +
133+
"Please confirm you are returning an instance of " +
134+
"`Map<unstable_routerContext, unknown>` from your `getLoadContext` function." +
135+
`\n\nError: ${e instanceof Error ? e.toString() : e}`
136+
);
137+
handleError(error);
138+
return returnLastResortErrorResponse(error, serverMode);
139+
}
140+
}
141+
} else {
142+
loadContext = initialContext || {};
143+
}
144+
113145
let url = new URL(request.url);
114146

115147
let normalizedBasename = _build.basename || "/";
@@ -127,19 +159,6 @@ export const createRequestHandler: CreateRequestHandlerFunction = (
127159
normalizedPath = normalizedPath.slice(0, -1);
128160
}
129161

130-
let params: RouteMatch<ServerRoute>["params"] = {};
131-
let handleError = (error: unknown) => {
132-
if (mode === ServerMode.Development) {
133-
getDevServerHooks()?.processRequestError?.(error);
134-
}
135-
136-
errorHandler(error, {
137-
context: loadContext,
138-
params,
139-
request,
140-
});
141-
};
142-
143162
// When runtime SSR is disabled, make our dev server behave like the deployed
144163
// pre-rendered site would
145164
if (!_build.ssr) {

0 commit comments

Comments
 (0)