diff --git a/packages/react-client/src/__tests__/ReactFlight-test.js b/packages/react-client/src/__tests__/ReactFlight-test.js index 13027da0234af..677f102c87913 100644 --- a/packages/react-client/src/__tests__/ReactFlight-test.js +++ b/packages/react-client/src/__tests__/ReactFlight-test.js @@ -776,6 +776,96 @@ describe('ReactFlight', () => { }); }); + it('should emit descriptions of errors in dev', async () => { + const ClientErrorBoundary = clientReference(ErrorBoundary); + + function Throw({value}) { + throw value; + } + + const testCases = ( + <> + +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ } /> +
+
+ +
+ +
+
+ +
+ +
+
+ + ); + + const transport = ReactNoopFlightServer.render(testCases, { + onError(x) { + return __DEV__ ? 'a dev digest' : `digest("${x.message}")`; + }, + }); + + await act(() => { + startTransition(() => { + ReactNoop.render(ReactNoopFlightClient.read(transport)); + }); + }); + }); + it('should trigger the inner most error boundary inside a Client Component', async () => { function ServerComponent() { throw new Error('This was thrown in the Server Component.'); diff --git a/packages/react-server/src/ReactFlightServer.js b/packages/react-server/src/ReactFlightServer.js index 1d1ca9891135d..a07c6297454b7 100644 --- a/packages/react-server/src/ReactFlightServer.js +++ b/packages/react-server/src/ReactFlightServer.js @@ -1677,8 +1677,10 @@ function emitErrorChunk( message = String(error.message); // eslint-disable-next-line react-internal/safe-string-coercion stack = String(error.stack); + } else if (typeof error === 'object' && error !== null) { + message = 'Error: ' + describeObjectForErrorMessage(error); } else { - message = 'Error: ' + (error: any); + message = 'Error: ' + String(error); } } catch (x) { message = 'An error occurred but serializing the error message failed.';