-
Notifications
You must be signed in to change notification settings - Fork 27.5k
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
feat: set status code to 500 if unexpected error occurs before streaming in app router #56236
Conversation
993febe
to
bee4a54
Compare
bee4a54
to
a5e0553
Compare
test/production/app-dir/unexpected-error/app/isr-unexpected-error/page.tsx
Outdated
Show resolved
Hide resolved
…ror/page.tsx Co-authored-by: Vũ Văn Dũng <me@joulev.dev>
@feedthejim I see that you have made some changes to this file. Even though I understand you might be very busy, could you please take a look at this PR? 🙏 It is only a small change and would help us greatly to go forward. |
Allow CI Workflow Run
Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer |
1 similar comment
Allow CI Workflow Run
Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM thanks @dpnolte
@feedthejim Thank you for having a look! 🙏 The pipeline failed so I synced the changes from the canary branch into my PR branch. However, It seems that another approval is needed to continue the workflow? |
Tests Passed |
Stats from current PRDefault BuildGeneral Overall increase
|
vercel/next.js canary | dpnolte/next.js fix/500_response_status | Change | |
---|---|---|---|
buildDuration | 10.4s | 10.4s | N/A |
buildDurationCached | 6.2s | 6.2s | N/A |
nodeModulesSize | 174 MB | 174 MB | |
nextStartRea..uration (ms) | 515ms | 518ms | N/A |
Client Bundles (main, webpack)
vercel/next.js canary | dpnolte/next.js fix/500_response_status | Change | |
---|---|---|---|
199-HASH.js gzip | 27.5 kB | 27.5 kB | ✓ |
3f784ff6-HASH.js gzip | 53.1 kB | 53.1 kB | ✓ |
99.HASH.js gzip | 182 B | 182 B | ✓ |
framework-HASH.js gzip | 45.3 kB | 45.3 kB | ✓ |
main-app-HASH.js gzip | 254 B | 251 B | N/A |
main-HASH.js gzip | 32.9 kB | 32.9 kB | N/A |
webpack-HASH.js gzip | 1.75 kB | 1.75 kB | N/A |
Overall change | 126 kB | 126 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | dpnolte/next.js fix/500_response_status | Change | |
---|---|---|---|
polyfills-HASH.js gzip | 31 kB | 31 kB | ✓ |
Overall change | 31 kB | 31 kB | ✓ |
Client Pages
vercel/next.js canary | dpnolte/next.js fix/500_response_status | Change | |
---|---|---|---|
_app-HASH.js gzip | 206 B | 205 B | N/A |
_error-HASH.js gzip | 182 B | 180 B | N/A |
amp-HASH.js gzip | 506 B | 505 B | N/A |
css-HASH.js gzip | 322 B | 323 B | N/A |
dynamic-HASH.js gzip | 2.57 kB | 2.57 kB | N/A |
edge-ssr-HASH.js gzip | 260 B | 259 B | N/A |
head-HASH.js gzip | 350 B | 350 B | ✓ |
hooks-HASH.js gzip | 369 B | 369 B | ✓ |
image-HASH.js gzip | 4.35 kB | 4.35 kB | N/A |
index-HASH.js gzip | 256 B | 256 B | ✓ |
link-HASH.js gzip | 2.64 kB | 2.63 kB | N/A |
routerDirect..HASH.js gzip | 312 B | 311 B | N/A |
script-HASH.js gzip | 385 B | 384 B | N/A |
withRouter-HASH.js gzip | 307 B | 308 B | N/A |
1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
Overall change | 1.08 kB | 1.08 kB | ✓ |
Client Build Manifests
vercel/next.js canary | dpnolte/next.js fix/500_response_status | Change | |
---|---|---|---|
_buildManifest.js gzip | 485 B | 482 B | N/A |
Overall change | 0 B | 0 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | dpnolte/next.js fix/500_response_status | Change | |
---|---|---|---|
index.html gzip | 528 B | 528 B | ✓ |
link.html gzip | 542 B | 541 B | N/A |
withRouter.html gzip | 524 B | 524 B | ✓ |
Overall change | 1.05 kB | 1.05 kB | ✓ |
Edge SSR bundle Size
vercel/next.js canary | dpnolte/next.js fix/500_response_status | Change | |
---|---|---|---|
edge-ssr.js gzip | 93.7 kB | 93.7 kB | N/A |
page.js gzip | 154 kB | 154 kB | N/A |
Overall change | 0 B | 0 B | ✓ |
Middleware size
vercel/next.js canary | dpnolte/next.js fix/500_response_status | Change | |
---|---|---|---|
middleware-b..fest.js gzip | 625 B | 620 B | N/A |
middleware-r..fest.js gzip | 150 B | 151 B | N/A |
middleware.js gzip | 22.5 kB | 22.5 kB | N/A |
edge-runtime..pack.js gzip | 1.92 kB | 1.92 kB | ✓ |
Overall change | 1.92 kB | 1.92 kB | ✓ |
Diff details
Diff for page.js
Diff too large to display
@feedthejim There was an error in one of the e2e tests: https://github.com/vercel/next.js/blob/canary/test/e2e/app-dir/app/standalone.test.ts#L57-L101. The related error reported in the pipeline was: Even though I've had hard time to run this particular test locally, I've tried to fix by adding a missing |
@feedthejim the pipeline checks have passed 🎉 Would it be possible to merge this PR? 🙏 |
This PR therefore introduces to always set response status code to 500 unless it is a
NotFoundError
orRedirectError
. This PR would fix issue #56235. See also: https://codesandbox.io/p/sandbox/nice-panini-2z3mcp .Current Behavior
At the moment, when an unexpected error occurs during app server rendering, a 200 ok is returned as status code. This seems to be undesirable because of the success status CDNs will cache the error pages and crawlers will index the page considering the error content as the actual content.
Desired Behavior
This issue is related to discussion #53225. Even though I understand that the response status code cannot be set if streaming has started, in my view it would be best to set the response status to 500 whenever it can (so before the streaming has started) for SEO and (CDN) http caching. This would also be consistent with how 404s currently work; that is, response status code is set to 404 if
NotFoundError
occurred before streaming (related issue & PR).Ideally, when a runtime error happens after streaming, a
<meta name="robots" content="noindex" />
would also be added. But I didn't want to make the PR too complex before receiving feedback.