Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

propagate notFound errors past a segment's error boundary #60567

Merged

Conversation

ztanner
Copy link
Member

@ztanner ztanner commented Jan 12, 2024

What?

Throwing a notFound() error inside of a segment that has an error boundary will cause it to be handled by the segment's error boundary rather than a parent not-found boundary.

Why?

We assume anything that hits an ErrorBoundary is an actual error, but this should not be the case when the caught error is one that is handled by Next.js.

How?

This checks if the caught error is one that is expected to be handled someplace else.

Closes NEXT-2080
slack x-ref

Copy link
Member Author

ztanner commented Jan 12, 2024

This stack of pull requests is managed by Graphite. Learn more about stacking.

Join @ztanner and the rest of your teammates on Graphite Graphite

@ztanner ztanner force-pushed the 01-12-propagate_notFound_errors_past_a_segment_s_error_boundary branch from bb11329 to dc13cf6 Compare January 12, 2024 15:02
@ijjk
Copy link
Member

ijjk commented Jan 12, 2024

Stats from current PR

Default Build
General Overall increase ⚠️
vercel/next.js canary vercel/next.js 01-12-propagate_notFound_errors_past_a_segment_s_error_boundary Change
buildDuration 12.7s 12.8s N/A
buildDurationCached 7.2s 6.2s N/A
nodeModulesSize 200 MB 200 MB ⚠️ +1.83 kB
nextStartRea..uration (ms) 433ms 423ms N/A
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js 01-12-propagate_notFound_errors_past_a_segment_s_error_boundary Change
193.HASH.js gzip 181 B 182 B N/A
3f784ff6-HASH.js gzip 53.3 kB 53.3 kB N/A
433-HASH.js gzip 28.7 kB 28.8 kB N/A
framework-HASH.js gzip 45.2 kB 45.2 kB
main-app-HASH.js gzip 239 B 242 B N/A
main-HASH.js gzip 31.8 kB 31.8 kB N/A
webpack-HASH.js gzip 1.7 kB 1.7 kB N/A
Overall change 45.2 kB 45.2 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js 01-12-propagate_notFound_errors_past_a_segment_s_error_boundary Change
polyfills-HASH.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary vercel/next.js 01-12-propagate_notFound_errors_past_a_segment_s_error_boundary Change
_app-HASH.js gzip 194 B 195 B N/A
_error-HASH.js gzip 183 B 181 B N/A
amp-HASH.js gzip 504 B 502 B N/A
css-HASH.js gzip 321 B 321 B
dynamic-HASH.js gzip 2.5 kB 2.5 kB N/A
edge-ssr-HASH.js gzip 255 B 253 B N/A
head-HASH.js gzip 350 B 349 B N/A
hooks-HASH.js gzip 369 B 369 B
image-HASH.js gzip 4.28 kB 4.28 kB N/A
index-HASH.js gzip 255 B 256 B N/A
link-HASH.js gzip 2.61 kB 2.61 kB
routerDirect..HASH.js gzip 312 B 311 B N/A
script-HASH.js gzip 385 B 383 B N/A
withRouter-HASH.js gzip 307 B 308 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 3.4 kB 3.4 kB
Client Build Manifests
vercel/next.js canary vercel/next.js 01-12-propagate_notFound_errors_past_a_segment_s_error_boundary Change
_buildManifest.js gzip 483 B 484 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js 01-12-propagate_notFound_errors_past_a_segment_s_error_boundary Change
index.html gzip 529 B 527 B N/A
link.html gzip 541 B 540 B N/A
withRouter.html gzip 524 B 522 B N/A
Overall change 0 B 0 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js 01-12-propagate_notFound_errors_past_a_segment_s_error_boundary Change
edge-ssr.js gzip 93.8 kB 93.8 kB N/A
page.js gzip 148 kB 148 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary vercel/next.js 01-12-propagate_notFound_errors_past_a_segment_s_error_boundary Change
middleware-b..fest.js gzip 623 B 623 B
middleware-r..fest.js gzip 151 B 151 B
middleware.js gzip 37.5 kB 37.5 kB N/A
edge-runtime..pack.js gzip 1.92 kB 1.92 kB
Overall change 2.7 kB 2.7 kB
Next Runtimes
vercel/next.js canary vercel/next.js 01-12-propagate_notFound_errors_past_a_segment_s_error_boundary Change
app-page-exp...dev.js gzip 169 kB 169 kB
app-page-exp..prod.js gzip 95.2 kB 95.2 kB
app-page-tur..prod.js gzip 95.9 kB 95.9 kB
app-page-tur..prod.js gzip 90.5 kB 90.5 kB
app-page.run...dev.js gzip 142 kB 142 kB
app-page.run..prod.js gzip 89.8 kB 89.8 kB
app-route-ex...dev.js gzip 24.1 kB 24.1 kB
app-route-ex..prod.js gzip 16.7 kB 16.7 kB
app-route-tu..prod.js gzip 16.7 kB 16.7 kB
app-route-tu..prod.js gzip 16.3 kB 16.3 kB
app-route.ru...dev.js gzip 23.5 kB 23.5 kB
app-route.ru..prod.js gzip 16.3 kB 16.3 kB
pages-api-tu..prod.js gzip 9.38 kB 9.38 kB
pages-api.ru...dev.js gzip 9.65 kB 9.65 kB
pages-api.ru..prod.js gzip 9.37 kB 9.37 kB
pages-turbo...prod.js gzip 21.9 kB 21.9 kB
pages.runtim...dev.js gzip 22.5 kB 22.5 kB
pages.runtim..prod.js gzip 21.9 kB 21.9 kB
server.runti..prod.js gzip 49.6 kB 49.6 kB
Overall change 940 kB 940 kB
Diff details
Diff for page.js

Diff too large to display

Diff for 433-HASH.js

Diff too large to display

Commit: dab9038

@ijjk
Copy link
Member

ijjk commented Jan 12, 2024

Tests Passed

@ztanner ztanner force-pushed the 01-12-propagate_notFound_errors_past_a_segment_s_error_boundary branch from dc13cf6 to dab9038 Compare January 12, 2024 15:20
Comment on lines -24 to -30
} else {
expect(await browser.elementByCss('h2').text()).toBe(
'Application error: a server-side exception has occurred (see the server logs for more information).'
)
expect(await browser.elementByCss('p').text()).toBe(
'Digest: NEXT_NOT_FOUND'
)
Copy link
Member Author

@ztanner ztanner Jan 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Throwing an exception and leaking an internal digest does not seem like the right way to handle this. If a root not found boundary isn't detected, we should handle with a fallback 404 or fail the build if that's not possible. I think this can be done in a separate PR. For now this will simply render nothing on the screen, which seems like more reasonable interim behavior. We'll still show an error in dev.

Copy link
Collaborator

@gaspar09 gaspar09 Jan 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we show the same default 404 page we should for non-existing routes

Cc @ijjk

@ztanner ztanner marked this pull request as ready for review January 12, 2024 15:32
@huozhi huozhi merged commit 3da4811 into canary Jan 12, 2024
63 of 68 checks passed
@huozhi huozhi deleted the 01-12-propagate_notFound_errors_past_a_segment_s_error_boundary branch January 12, 2024 15:58
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jan 27, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants