diff --git a/packages/next/src/server/app-render/app-render.tsx b/packages/next/src/server/app-render/app-render.tsx index 5865195404a1c8..dd24e9f5afecb6 100644 --- a/packages/next/src/server/app-render/app-render.tsx +++ b/packages/next/src/server/app-render/app-render.tsx @@ -58,7 +58,11 @@ import { addImplicitTags } from '../lib/patch-fetch' import { AppRenderSpan, NextNodeServerSpan } from '../lib/trace/constants' import { getTracer } from '../lib/trace/tracer' import { FlightRenderResult } from './flight-render-result' -import { createErrorHandler, type ErrorHandler } from './create-error-handler' +import { + createErrorHandler, + type DigestedError, + type ErrorHandler, +} from './create-error-handler' import { getShortDynamicParamType, dynamicParamTypes, @@ -723,7 +727,7 @@ async function renderToHTMLOrFlightImpl( serverModuleMap, }) - const digestErrorsMap: Map = new Map() + const digestErrorsMap: Map = new Map() const allCapturedErrors: Error[] = [] const isNextExport = !!renderOpts.nextExport const { staticGenerationStore, requestStore } = baseCtx @@ -759,7 +763,7 @@ async function renderToHTMLOrFlightImpl( } as const // Including RSC rendering and flight data rendering - function getRSCError(err: Error & { digest: string }) { + function getRSCError(err: DigestedError) { const digest = err.digest if (!digestErrorsMap.has(digest)) { digestErrorsMap.set(digest, err) @@ -767,7 +771,7 @@ async function renderToHTMLOrFlightImpl( return err } - function getSSRError(err: Error & { digest: string }) { + function getSSRError(err: DigestedError) { // For SSR errors, if we have the existing digest in errors map, // we should use the existing error object to avoid duplicate error logs. if (digestErrorsMap.has(err.digest)) { @@ -776,14 +780,14 @@ async function renderToHTMLOrFlightImpl( return err } - function onFlightDataRenderError(err: Error & { digest: string }) { + function onFlightDataRenderError(err: DigestedError) { return onInstrumentationRequestError?.(err, req, { ...errorContext, renderSource: 'react-server-components-payload', }) } - function onServerRenderError(err: Error & { digest: string }) { + function onServerRenderError(err: DigestedError) { const renderSource = digestErrorsMap.has(err.digest) ? 'react-server-components' : 'server-rendering' 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 3cdf644bbcf54f..4b490855d0695b 100644 --- a/packages/next/src/server/app-render/create-error-handler.tsx +++ b/packages/next/src/server/app-render/create-error-handler.tsx @@ -15,6 +15,8 @@ export type ErrorHandler = ( errorInfo: unknown ) => string | undefined +export type DigestedError = Error & { digest: string } + /** * Create error handler for renderers. * Tolerate dynamic server errors during prerendering so console @@ -31,7 +33,7 @@ export function createErrorHandler({ dev?: boolean isNextExport?: boolean onReactStreamRenderError?: (err: any) => void - getErrorByRenderSource: (err: Error & { digest: string }) => Error + getErrorByRenderSource: (err: DigestedError) => Error allCapturedErrors?: Error[] silenceLogger?: boolean }): ErrorHandler { diff --git a/test/e2e/on-request-error/basic/basic.test.ts b/test/e2e/on-request-error/basic/basic.test.ts index 7fd93b7da89ef7..f63c0f96396f8f 100644 --- a/test/e2e/on-request-error/basic/basic.test.ts +++ b/test/e2e/on-request-error/basic/basic.test.ts @@ -27,7 +27,7 @@ describe('on-request-error - basic', () => { }: { name: string url: string - renderSource?: string + renderSource: string | undefined isMiddleware?: boolean }) { await retry(async () => { @@ -62,7 +62,7 @@ describe('on-request-error - basic', () => { }: { payload: any url: string - renderSource?: string + renderSource: string | undefined isMiddleware: boolean }) { const { request } = payload @@ -74,9 +74,7 @@ describe('on-request-error - basic', () => { expect(request.url).toBe(url) } - if (renderSource) { - expect(payload.context.renderSource).toBe(renderSource) - } + expect(payload.context.renderSource).toBe(renderSource) expect(request.method).toBe('GET') expect(request.headers['accept']).toBe('*/*') @@ -128,6 +126,7 @@ describe('on-request-error - basic', () => { await validateErrorRecord({ name: 'route-node-error', url: '/app-route', + renderSource: undefined, }) }) @@ -136,6 +135,7 @@ describe('on-request-error - basic', () => { await validateErrorRecord({ name: 'route-edge-error', url: '/app-route/edge', + renderSource: undefined, }) }) }) @@ -146,6 +146,7 @@ describe('on-request-error - basic', () => { await validateErrorRecord({ name: 'pages-page-node-error', url: '/page', + renderSource: undefined, }) }) @@ -154,6 +155,7 @@ describe('on-request-error - basic', () => { await validateErrorRecord({ name: 'pages-page-edge-error', url: '/page/edge', + renderSource: undefined, }) }) @@ -162,6 +164,7 @@ describe('on-request-error - basic', () => { await validateErrorRecord({ name: 'api-node-error', url: '/api/pages-route', + renderSource: undefined, }) }) @@ -170,6 +173,7 @@ describe('on-request-error - basic', () => { await validateErrorRecord({ name: 'api-edge-error', url: '/api/pages-route/edge', + renderSource: undefined, }) }) }) @@ -181,6 +185,7 @@ describe('on-request-error - basic', () => { name: 'middleware-error', url: '/middleware-error', isMiddleware: true, + renderSource: undefined, }) }) })