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.';