diff --git a/packages/next/src/server/app-render/app-render.tsx b/packages/next/src/server/app-render/app-render.tsx index ebf6289602e9c..c69ddb54b515d 100644 --- a/packages/next/src/server/app-render/app-render.tsx +++ b/packages/next/src/server/app-render/app-render.tsx @@ -1233,16 +1233,6 @@ async function renderToStream( const reactServerErrorsByDigest: Map = new Map() const silenceLogger = false - const serverComponentsErrorHandler = createHTMLReactServerErrorHandler( - !!renderOpts.dev, - !!renderOpts.nextExport, - reactServerErrorsByDigest, - silenceLogger, - // RSC rendering error will report as SSR error - // @TODO we should report RSC errors where they happen for instrumentation purposes - // and should omit the error reporter in the SSR layer instead - undefined - ) function onHTMLRenderRSCError(err: DigestedError) { return renderOpts.onInstrumentationRequestError?.( err, @@ -1250,6 +1240,13 @@ async function renderToStream( createErrorContext(ctx, 'react-server-components') ) } + const serverComponentsErrorHandler = createHTMLReactServerErrorHandler( + !!renderOpts.dev, + !!renderOpts.nextExport, + reactServerErrorsByDigest, + silenceLogger, + onHTMLRenderRSCError + ) function onHTMLRenderSSRError(err: DigestedError) { return renderOpts.onInstrumentationRequestError?.( @@ -1266,7 +1263,6 @@ async function renderToStream( reactServerErrorsByDigest, allCapturedErrors, silenceLogger, - onHTMLRenderRSCError, onHTMLRenderSSRError ) @@ -1651,16 +1647,6 @@ async function prerenderToStream( const reactServerErrorsByDigest: Map = new Map() // We don't report errors during prerendering through our instrumentation hooks const silenceLogger = !!renderOpts.experimental.isRoutePPREnabled - const serverComponentsErrorHandler = createHTMLReactServerErrorHandler( - !!renderOpts.dev, - !!renderOpts.nextExport, - reactServerErrorsByDigest, - silenceLogger, - // RSC rendering error will report as SSR error - // @TODO we should report RSC errors where they happen for instrumentation purposes - // and should omit the error reporter in the SSR layer instead - undefined - ) function onHTMLRenderRSCError(err: DigestedError) { return renderOpts.onInstrumentationRequestError?.( err, @@ -1668,6 +1654,13 @@ async function prerenderToStream( createErrorContext(ctx, 'react-server-components') ) } + const serverComponentsErrorHandler = createHTMLReactServerErrorHandler( + !!renderOpts.dev, + !!renderOpts.nextExport, + reactServerErrorsByDigest, + silenceLogger, + onHTMLRenderRSCError + ) function onHTMLRenderSSRError(err: DigestedError) { return renderOpts.onInstrumentationRequestError?.( @@ -1683,7 +1676,6 @@ async function prerenderToStream( reactServerErrorsByDigest, allCapturedErrors, silenceLogger, - onHTMLRenderRSCError, onHTMLRenderSSRError ) diff --git a/packages/next/src/server/app-render/create-error-handler.tsx b/packages/next/src/server/app-render/create-error-handler.tsx index 5977425095edb..9db7cbbc49f18 100644 --- a/packages/next/src/server/app-render/create-error-handler.tsx +++ b/packages/next/src/server/app-render/create-error-handler.tsx @@ -141,20 +141,19 @@ export function createHTMLErrorHandler( reactServerErrors: Map, allCapturedErrors: Array, silenceLogger: boolean, - onHTMLRenderRSCError: (err: any) => void, onHTMLRenderSSRError: (err: any) => void ): ErrorHandler { return (err: any, errorInfo: any) => { - let isRSCError = false + let isSSRError = true + // If the error already has a digest, respect the original digest, // so it won't get re-generated into another new error. - if (err.digest) { if (reactServerErrors.has(err.digest)) { - isRSCError = true // This error is likely an obfuscated error from react-server. // We recover the original error here. err = reactServerErrors.get(err.digest) + isSSRError = false } else { // The error is not from react-server but has a digest // from other means so we don't need to produce a new one @@ -206,12 +205,12 @@ export function createHTMLErrorHandler( }) } - if (!silenceLogger) { - if (isRSCError) { - onHTMLRenderRSCError(err) - } else { - onHTMLRenderSSRError(err) - } + if ( + !silenceLogger && + // HTML errors contain RSC errors as well, filter them out before reporting + isSSRError + ) { + onHTMLRenderSSRError(err) } }