Skip to content

Commit d7e1761

Browse files
authored
add debug logs to onSegmentPrerenderError (#86358)
Adds logs to collectSegmentError when verbose logging is enabled to help identify errors that occur during this phase.
1 parent 1923ed6 commit d7e1761

File tree

5 files changed

+80
-17
lines changed

5 files changed

+80
-17
lines changed

packages/next/errors.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -946,5 +946,6 @@
946946
"945": "createNodeStreamFromChunks cannot be used in the edge runtime",
947947
"946": "Failed to deserialize errors.",
948948
"947": "Expected `sendErrorsToBrowser` to be defined in renderOpts.",
949-
"948": "Failed to serialize errors."
949+
"948": "Failed to serialize errors.",
950+
"949": "Route %s errored during %s. These errors are normally ignored and may not prevent the route from prerendering but are logged here because build debugging is enabled.\n \nOriginal Error: %s"
950951
}

packages/next/src/server/app-render/app-render.tsx

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,10 @@ import {
170170
createReactServerPrerenderResultFromRender,
171171
prerenderAndAbortInSequentialTasks,
172172
} from './app-render-prerender-utils'
173-
import { printDebugThrownValueForProspectiveRender } from './prospective-render-utils'
173+
import {
174+
Phase,
175+
printDebugThrownValueForProspectiveRender,
176+
} from './prospective-render-utils'
174177
import {
175178
pipelineInSequentialTasks,
176179
scheduleInSequentialTasks,
@@ -1073,7 +1076,11 @@ async function prospectiveRuntimeServerPrerender(
10731076
process.env.NEXT_DEBUG_BUILD ||
10741077
process.env.__NEXT_VERBOSE_LOGGING
10751078
) {
1076-
printDebugThrownValueForProspectiveRender(err, workStore.route)
1079+
printDebugThrownValueForProspectiveRender(
1080+
err,
1081+
workStore.route,
1082+
Phase.ProspectiveRender
1083+
)
10771084
}
10781085
},
10791086
// We don't want to stop rendering until the cacheSignal is complete so we pass
@@ -1110,7 +1117,11 @@ async function prospectiveRuntimeServerPrerender(
11101117
) {
11111118
// We don't normally log these errors because we are going to retry anyway but
11121119
// it can be useful for debugging Next.js itself to get visibility here when needed
1113-
printDebugThrownValueForProspectiveRender(err, workStore.route)
1120+
printDebugThrownValueForProspectiveRender(
1121+
err,
1122+
workStore.route,
1123+
Phase.ProspectiveRender
1124+
)
11141125
}
11151126
return null
11161127
}
@@ -3832,7 +3843,11 @@ async function warmupModuleCacheForRuntimeValidationInDev(
38323843
) {
38333844
// We don't normally log these errors because we are going to retry anyway but
38343845
// it can be useful for debugging Next.js itself to get visibility here when needed
3835-
printDebugThrownValueForProspectiveRender(err, workStore.route)
3846+
printDebugThrownValueForProspectiveRender(
3847+
err,
3848+
workStore.route,
3849+
Phase.ProspectiveRender
3850+
)
38363851
}
38373852
},
38383853
// We don't need bootstrap scripts in this prerender
@@ -3863,7 +3878,11 @@ async function warmupModuleCacheForRuntimeValidationInDev(
38633878
) {
38643879
// We don't normally log these errors because we are going to retry anyway but
38653880
// it can be useful for debugging Next.js itself to get visibility here when needed
3866-
printDebugThrownValueForProspectiveRender(err, workStore.route)
3881+
printDebugThrownValueForProspectiveRender(
3882+
err,
3883+
workStore.route,
3884+
Phase.ProspectiveRender
3885+
)
38673886
}
38683887
})
38693888

@@ -4350,7 +4369,11 @@ async function prerenderToStream(
43504369
process.env.NEXT_DEBUG_BUILD ||
43514370
process.env.__NEXT_VERBOSE_LOGGING
43524371
) {
4353-
printDebugThrownValueForProspectiveRender(err, workStore.route)
4372+
printDebugThrownValueForProspectiveRender(
4373+
err,
4374+
workStore.route,
4375+
Phase.ProspectiveRender
4376+
)
43544377
}
43554378
},
43564379
// We don't want to stop rendering until the cacheSignal is complete so we pass
@@ -4402,7 +4425,11 @@ async function prerenderToStream(
44024425
) {
44034426
// We don't normally log these errors because we are going to retry anyway but
44044427
// it can be useful for debugging Next.js itself to get visibility here when needed
4405-
printDebugThrownValueForProspectiveRender(err, workStore.route)
4428+
printDebugThrownValueForProspectiveRender(
4429+
err,
4430+
workStore.route,
4431+
Phase.ProspectiveRender
4432+
)
44064433
}
44074434
}
44084435

@@ -4473,7 +4500,11 @@ async function prerenderToStream(
44734500
) {
44744501
// We don't normally log these errors because we are going to retry anyway but
44754502
// it can be useful for debugging Next.js itself to get visibility here when needed
4476-
printDebugThrownValueForProspectiveRender(err, workStore.route)
4503+
printDebugThrownValueForProspectiveRender(
4504+
err,
4505+
workStore.route,
4506+
Phase.ProspectiveRender
4507+
)
44774508
}
44784509
},
44794510
bootstrapScripts: [bootstrapScript],
@@ -4503,7 +4534,11 @@ async function prerenderToStream(
45034534
) {
45044535
// We don't normally log these errors because we are going to retry anyway but
45054536
// it can be useful for debugging Next.js itself to get visibility here when needed
4506-
printDebugThrownValueForProspectiveRender(err, workStore.route)
4537+
printDebugThrownValueForProspectiveRender(
4538+
err,
4539+
workStore.route,
4540+
Phase.ProspectiveRender
4541+
)
45074542
}
45084543
})
45094544

packages/next/src/server/app-render/collect-segment-data.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ import {
2727
HEAD_REQUEST_KEY,
2828
} from '../../shared/lib/segment-cache/segment-value-encoding'
2929
import { getDigestForWellKnownError } from './create-error-handler'
30+
import {
31+
Phase,
32+
printDebugThrownValueForProspectiveRender,
33+
} from './prospective-render-utils'
34+
import { workAsyncStorage } from './work-async-storage.external'
3035

3136
// Contains metadata about the route tree. The client must fetch this before
3237
// it can fetch any actual segment data.
@@ -85,6 +90,14 @@ function onSegmentPrerenderError(error: unknown) {
8590
}
8691
// We don't need to log the errors because we would have already done that
8792
// when generating the original Flight stream for the whole page.
93+
if (process.env.NEXT_DEBUG_BUILD || process.env.__NEXT_VERBOSE_LOGGING) {
94+
const workStore = workAsyncStorage.getStore()
95+
printDebugThrownValueForProspectiveRender(
96+
error,
97+
workStore?.route ?? 'unknown route',
98+
Phase.SegmentCollection
99+
)
100+
}
88101
}
89102

90103
export async function collectSegmentData(

packages/next/src/server/app-render/prospective-render-utils.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
import { getDigestForWellKnownError } from './create-error-handler'
22
import { isReactLargeShellError } from './react-large-shell-error'
33

4+
export enum Phase {
5+
ProspectiveRender = 'the prospective render',
6+
SegmentCollection = 'segment collection',
7+
}
8+
49
export function printDebugThrownValueForProspectiveRender(
510
thrownValue: unknown,
6-
route: string
11+
route: string,
12+
phase: Phase
713
) {
814
// We don't need to print well-known Next.js errors.
915
if (getDigestForWellKnownError(thrownValue)) {
@@ -28,7 +34,7 @@ export function printDebugThrownValueForProspectiveRender(
2834
const stackStart = originalErrorStack.indexOf('\n')
2935
if (stackStart > -1) {
3036
const error = new Error(
31-
`Route ${route} errored during the prospective render. These errors are normally ignored and may not prevent the route from prerendering but are logged here because build debugging is enabled.
37+
`Route ${route} errored during ${phase}. These errors are normally ignored and may not prevent the route from prerendering but are logged here because build debugging is enabled.
3238
3339
Original Error: ${message}`
3440
)
@@ -43,14 +49,14 @@ Original Error: ${message}`
4349
}
4450

4551
if (message) {
46-
console.error(`Route ${route} errored during the prospective render. These errors are normally ignored and may not prevent the route from prerendering but are logged here because build debugging is enabled. No stack was provided.
52+
console.error(`Route ${route} errored during ${phase}. These errors are normally ignored and may not prevent the route from prerendering but are logged here because build debugging is enabled. No stack was provided.
4753
4854
Original Message: ${message}`)
4955
return
5056
}
5157

5258
console.error(
53-
`Route ${route} errored during the prospective render. These errors are normally ignored and may not prevent the route from prerendering but are logged here because build debugging is enabled. The thrown value is logged just following this message`
59+
`Route ${route} errored during ${phase}. These errors are normally ignored and may not prevent the route from prerendering but are logged here because build debugging is enabled. The thrown value is logged just following this message`
5460
)
5561
console.error(thrownValue)
5662
return

packages/next/src/server/route-modules/app-route/module.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ import {
3131
import { HeadersAdapter } from '../../web/spec-extension/adapters/headers'
3232
import { RequestCookiesAdapter } from '../../web/spec-extension/adapters/request-cookies'
3333
import { parsedUrlQueryToParams } from './helpers/parsed-url-query-to-params'
34-
import { printDebugThrownValueForProspectiveRender } from '../../app-render/prospective-render-utils'
34+
import {
35+
Phase,
36+
printDebugThrownValueForProspectiveRender,
37+
} from '../../app-render/prospective-render-utils'
3538

3639
import * as serverHooks from '../../../client/components/hooks-server-context'
3740
import { DynamicServerError } from '../../../client/components/hooks-server-context'
@@ -432,7 +435,11 @@ export class AppRouteRouteModule extends RouteModule<
432435
process.env.NEXT_DEBUG_BUILD ||
433436
process.env.__NEXT_VERBOSE_LOGGING
434437
) {
435-
printDebugThrownValueForProspectiveRender(err, workStore.route)
438+
printDebugThrownValueForProspectiveRender(
439+
err,
440+
workStore.route,
441+
Phase.ProspectiveRender
442+
)
436443
}
437444
}
438445
if (
@@ -452,7 +459,8 @@ export class AppRouteRouteModule extends RouteModule<
452459
} else if (process.env.NEXT_DEBUG_BUILD) {
453460
printDebugThrownValueForProspectiveRender(
454461
err,
455-
workStore.route
462+
workStore.route,
463+
Phase.ProspectiveRender
456464
)
457465
}
458466
}

0 commit comments

Comments
 (0)